SQL左连接 - 右表中的多行

时间:2017-08-13 16:09:04

标签: php mysql sql search join

我正在尝试制作PHP / MySQL搜索表单。当用户想要搜索时,他需要填写3个输入字段: FromDate ToDate SucategoryID

有2个表: Items和ItemsBlockDates 在表项中,有关于项的信息,它由ID标识。 在表ItemBlockDates中,有关于Item不会在搜索结果中显示的句点的信息。它包含: ItemID,FromDate 日期字段。此外,还可以为一个项目定义多个阻止日期。

现在,我想选择FromDate和To Date输入与ItemsBlockDates中具有相同ItemID的任何行不匹配的所有项目。

我写了一个查询,但是有一个问题:

SELECT * 
FROM Items 
LEFT JOIN ItemBlockDates ON Items.ID = ItemBlockDates.ItemID 
WHERE Items.SubcategoryID = :SubcategoryID   
  AND ItemBlockDates.FromDate NOT BETWEEN CAST(:FromDate AS DATETIME) AND CAST(:ToDate AS DATETIME)

当我运行此查询时,它不会显示未设置块日期的项目,也会显示设置了多个块日期的项目。

1 个答案:

答案 0 :(得分:0)

  

我想选择FromDate和To Date输入中没有的所有项目   匹配ItemsBlockDates中具有相同ItemID的任何行。

对我来说,这表明NOT EXISTS

SELECT i.* 
FROM Items i
WHERE i.SubcategoryID = :SubcategoryID AND
      NOT EXISTS (SELECT 1
                  FROM ItemBlockDates ibd
                  WHERE i.ID = ibd.ItemID AND
                        ibd.FromDate BETWEEN CAST(:FromDate AS DATETIME) AND CAST(:ToDate AS DATETIME)
                 );

如果您传递参数,我不确定您为什么需要转换为DATETIME。您应该能够以正确的类型传递它。