2017-04-08 9 views
0

私はチェックインとチェックアウトの日付の間に利用可能なホテルを表示するクエリを作成しようとします。また、特定の部屋の予約をするときに、その予約列を1に設定します。つまり、チェックアウト日が実際に来ると、トリガー機能によってその予約列が0に設定されます。日付で検索クエリ

ホテルは予約され(予約= 1)、それらの客室のチェックインチェックアウト日付は特定の日付(チェックインチェックアウト入力)であるため、そのホテルをリストに入れないでください。私の質問には私が望む結果が表示されません。

クエリ:入力:国(州)、チェックインとチェックアウト。

SELECT DISTINCT a.* FROM accommodation a INNER JOIN cb_states s ON a.state = s.id 
INNER JOIN accommodation_rooms ar ON a.id = ar.accommodation 
WHERE state = 1 AND a.id NOT IN 
(
    SELECT 1 FROM booking b 
    WHERE 
    (
     (b.arrival_date BETWEEN '2017-11-16' AND '2018-03-16') 
     OR 
     (b.departure_date BETWEEN '2017-11-16' AND '2018-03-16') 
    ) 
) 

クエリを実行すると、日付に関係なく常にすべてのホテルが表示されます。 ... WHERE ar.booked = 0 AND state = 1 AND a.id NOT IN...と書くと、宿舎ID13は表示されませんが、日付を変更しても表示されません。

宿泊テーブル: table 1

accommodation_roomsテーブル: table 2

予約テーブル: table 3

booked_roomsテーブル:あなたが持っている table 4

答えて

1

(予約表に外部キーを持っています)複数あなたの質問の問題:

  1. NOT INリストはSELECT 1です。それはNOT INリストに多種多様なものを与えません。
  2. オーバーラップのロジックが間違っています。
  3. 私はあなたが予約された宿泊施設の部屋に宿泊部屋を接続する必要があると思う。
  4. だから、

:私の状況のた​​めに最善の論理何ができるか

SELECT DISTINCT a.* 
FROM accommodation a INNER JOIN 
    cb_states s 
    ON a.state = s.id INNER JOIN 
    accommodation_rooms ar 
    ON a.id = ar.accommodation 
WHERE s.state = 1 AND 
     a.id NOT IN (SELECT br.accommodation_room 
        FROM booking b JOIN 
         booked_room br 
         ON b.?? = br.?? 
        WHERE b.arrival_date <= '2018-03-16' AND 
         b.departure_date >= '2017-11-16' 
       ); 
+0

? –

+0

@MalenaT。 。 。これには論理的な修正があります。 'between 'の代わりに' <= 'は* any * overlapを見つけます。 –

+0

私は参照してください。ありがとう、 'b。?? = br。?? 'ここで' b.id = br.booking'と書きましたが、それでも間違った結果が表示されます。さらに、私はサブクエリ '..... JOIN booked_rooms br ON b.id = br.booking JOIN accommodation_rooms aar on br.room = aar.id'の予約された部屋に宿泊部屋を接続しました。間違った結果が再び表示されます。 –

関連する問題