2017-11-03 13 views
1

私はこのような2つのテーブルを持っているMySQLは左に参加WHERE条件

部屋

id | number 
1 | 111 
2 | 112 

occupied_rooms

id | check_in | check_out | room_id 
1 | 2017-10-01 | 2017-10-04 | 1 

私はすべての空いた客室日付に従ってを取得したいですcheck_inとcheck_outを試してみました

select r.id 
    , r.number 
    from rooms r 
    left join occupied_rooms o 
    on r.id = o.room_id 
where (o.check_in not between "2017-10-05" and "2017-10-08") 
or (o.check_in >= "2017-10-05" and o.check_out <= "2017-10-08")) 

しかし、このクエリは私にこのような結果を与えます。これは間違っています。

id | number 
1 | 111 

このクエリで何が問題になっていますか? ご協力ありがとうございました

+0

check_in、check_outのデフォルト値は何ですか?それはヌルですか? –

答えて

1

idが一致し、目的の滞在範囲がoccupied_roomsテーブルの範囲と重複するという条件で2つのテーブルを結合するだけです。

SELECT r.* 
FROM rooms r 
LEFT JOIN occupied_rooms t 
    ON r.id = t.id AND 
     ('2017-10-02' <= t.check_out AND '2017-10-03' >= t.check_in) 
WHERE 
    t.id IS NULL; -- NULL value indicates the room did not overlap 
        -- with any existing reservations 

また、SQLクエリで範囲が重複に対処する方法については、このgreat reference questionをチェックアウトすることができます。それはあなたが直面している問題をはるかに簡単にします。表中の

Demo

+0

おかげで私は "null"を追加し、クエリがPHPスクリプトから起動されたときに期待どおりに機能しましたが、クエリがphpmyadminで実行されたときに2つの結果が得られました。 - select rooms.number \t '部屋 'は 'rooms'に' occupied_rooms'を残しました.'id' = '占有した部屋' .'room_id' \t(' occupied_rooms'.check_in'は "2017-10-02"と "2017-10-02"の間にありません"または" occupied_rooms "。=" 2017-10-02 "および" occupied_rooms ".check_out' <=" 2017-10-08 ")または' occupied_rooms'。 'id'はヌルです – sanu

+0

編集私のデモ、更新し、ここにリンクを貼り付けてください。私はあなたのデータが問題だと思っています。 –

0

あなたのデータoccupied_roomsを "" での最初の条件を満たしています。

check_in日(2017年10月1日)は、 "2017年10月5日" と "2017年10月8日" とがあるごの間ではありません。

したがって、結果はこのデータに含まれます。

期待する出力を教えてください。

+0

オーバーラッピング範囲はこれより少し複雑です。ここ:https://stackoverflow.com/questions/325933/determine-whether-two-date-ranges-overlap –