2011-06-20 24 views
0

予約がある場合とない場合があります。予約は(日付)から(日付)までです。人は日付で部屋を検索します:from_fieldとtill_field。部屋があるかどうかを調べようとしています。MySQLの質問の質問:予約システム同様

SELECT rooms.* FROM rooms 
LEFT JOIN reservations ON reservations.room_id = rooms.id 
WHERE (reservations.from > till_field OR reservations.till < from_field) 

問題:単一の予約が成功した場合、別の予約がスポットを占めているにもかかわらず、クエリが利用できるように部屋を持っているようです。

+0

問題は何ですか? –

+0

LEFT JOINは問題を引き起こしています。予約がない場合、客室を返却しません。 – John

答えて

3

どのようにまったくresevations付きの客室を取得するために:

何の予約がない場合は、クエリによって返さ一切reservations行は存在しません=>あなたがそれをチェックする必要があり、また(reservations.room_id IS NULL ):

SELECT rooms.* FROM rooms 
LEFT JOIN reservations ON reservations.room_id = rooms.id 
WHERE reservations.room_id IS NULL -- if there is no reservations 
     OR reservations.from > till_field 
     OR reservations.till < from_field 

しかし、実際に何をしたいのou取得するには、あなたが任意の予約を持っていない部屋をチェックする必要があります。

  • fromDate or tillDate between from_field and till_field
  • OR

  • fromDate < from_field and tillDate > till_field

SELECT rooms.* 
    FROM rooms 
WHERE NOT EXISTS (SELECT NULL 
        FROM reservations 
        WHERE reservations.room_id = rooms.id 
        AND ((
          reservations.from BETWEEN from_field AND till_field 
          OR 
          reservations.till BETWEEN from_field AND till_field 
         ) 
         OR 
         (
          reservations.from < from_field 
          AND reservations.till > till_field 
         ) 
         ) 
       ) 
+0

問題... 1つの予約が成功した場合、その部屋に空きがあるとの問い合わせがあります。部屋が利用できるようにするために左の予約をすべて成功させる方法はありますか? – John

+1

わかりやすい解答で私の答えを編集しました。 – manji

+0

ありがとう、それはまだ働いていない。実際のクエリははるかに複雑ですが、これは束に役立ちます。 – John