【问题标题】:SQL Left Join - Multiple Rows in Right TableSQL左连接 - 右表中的多行
【发布时间】:2018-01-21 13:45:11
【问题描述】:

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

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

现在,我想选择 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)

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

【问题讨论】:

    标签: php mysql sql search join


    【解决方案1】:

    我想选择 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。您应该能够以正确的类型传入它。

    【讨论】:

      猜你喜欢
      • 2015-07-27
      • 2021-03-10
      • 1970-01-01
      • 1970-01-01
      • 2020-04-27
      • 1970-01-01
      • 2020-07-28
      • 1970-01-01
      • 2016-12-13
      相关资源
      最近更新 更多