2017-01-28 9 views
1

私は現在ホテルの予約サービスを行っており、特定の期間中に特定の部屋タイプとホテルのすべての無料ルームを表示したいと考えています。 私はそれが気づくまで、動作するクエリであると思ったものを見つけました。部屋が全く予約をしていないと動作しません。特定の期間に無料の部屋を見つけるためのSQL

SELECT DISTINCT r.id, 
      r.num, 
      r.NAME, 
      h.NAME, 
      h.city, 
      h.country 
FROM room r 
    JOIN hotel h 
    ON r.hotel_id = h.id 
    JOIN room_type rt 
    ON r.room_type_id = rt.id 
WHERE r.id NOT IN (SELECT room_id 
        FROM reservation 
        WHERE ('$from' BETWEEN start_date AND end_date) 
         OR (start_date BETWEEN '$from' AND '$to') 
         OR '$from' = start_date) 
    AND $roomtype = rt.id 
    AND $hotel = h.id 

このクエリは、予約日の利用者が選択したスタートで、$への「から$」PHPスクリプトどこで使用される予約の終わりであるなど

このクエリを作成する方法はあります部屋に予約がない場合でも動作しますか? ご迷惑をおかけして申し訳ございません。ないフリーの部屋のために

答えて

0

ロジックは次のとおりです。

  • 予約は、上または終了し、問題の期間の前に開始します。
  • 予約は、問題期間の開始時以降に開始されます。

無料で利用できます。さんがあなたのクエリにこのロジックを適用してみましょう:

SELECT r.id, r.num, r.name, h.name, h.city, h.country 
FROM room r JOIN 
    hotel h 
    ON r.hotel_id = h.id JOIN 
    room_type rt 
    ON r.room_type_id = rt.id 
WHERE rt.id = $roomtype AND 
     h.id = $hotel AND 
     r.id NOT IN (SELECT res.room_id 
        FROM reservation res 
        WHERE '$to' <= end_date AND 
         '$from' >= start_date AND 
       ); 

注:あなたはむしろ、クエリ文字列をいじるよりも、クエリ内の値のパラメータを使用する必要があります。

+0

このような迅速な対応をありがとうございます。私はあなたのロジックを適用し、今それは最終的に正常に動作します!また、サブクエリの前にrt.idとr.idをチェックするのは大変意味があります。ありがとう:) – heap1

関連する問題