我正在尝试制作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)
当我运行此查询时,它不会显示未设置块日期的项目,也会显示设置了多个块日期的项目。
答案 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
。您应该能够以正确的类型传递它。