2017-08-13 92 views
0

我正在嘗試製作PHP/MySQL搜索表單。當用戶想要搜索時,他需要填寫3個輸入字段:FromDateToDate and SucategoryIDSQL左連接 - 多行右表

有兩個表格:項目和項目塊日期 在表項中,有關於該項目的信息,它由ID標識。 在Table ItemBlockDates中,有關Item不會顯示在搜索結果中的時間段的信息。它包含:ItemID,FromDate日期字段。另外,可以爲一個項目定義多個Block Date。

現在,我想選擇FromDate和To Date輸入與ItemBlockDates中具有相同ItemID的任何行不匹配的所有Items。

我寫了查詢,但有一個問題:

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

我想選擇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。你應該能夠以正確的類型傳遞它。