2017-08-13 11 views
0

PHP/MySQL検索フォームを作成しようとしています。ユーザーが検索したいときは、3つの入力フィールドを入力する必要があります。FromDateToDateおよびSucategoryIDSQL Left Join - 右テーブルの複数の行

テーブルが2つありますアイテムとアイテムブロックデート アイテムの情報があり、IDで識別されています。 テーブルItemBlockDatesには、アイテムが検索結果に表示されない期間に関する情報があります。内容:ItemID、FromDate、および日付フィールド。また、1つの明細に対して複数のブロック日付を定義する可能性があります。

ここで、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) 

それはアイテムを表示しない、また、それは、複数のブロックの日付がある項目が表示されますセット。

答えて

0

私はFROMDATEと日付の入力には、同じアイテムIDを持つ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に変換する必要がある理由はよく分かりません。正しいタイプで渡すことができます。