繁体   English   中英

SQL左联接-右表中的多行

[英]SQL Left Join - Multiple Rows in Right Table

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

有2个表: Items和ItemsBlockDates在Table Items中,有关于该项目的信息,并由ID标识。 在表ItemBlockDates中,有关于一段时间的信息,该期间不会在搜索结果中显示Item。 它包含: ItemID,FromDateDate字段。 同样,有可能为一项定义多个“冻结日期”。

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

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

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)

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

我要选择FromDate和To Date输入与具有相同ItemID的ItemsBlockDates任何行都不匹配的所有项。

对我来说,这表明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 您应该能够以正确的类型传递它。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM