あなたが抱えている問題は、クエリが十分に堅牢ではないということです。問題を分解すると、次のようになります。
$check_inで定義された範囲の場合 および$check_out checkinで定義された範囲と重複しています およびcheckout 任意 ちなみに、部屋は予約されています。それ以外の場合は無料です。
これは次のことを意味します:
-
$check_inの場合>=checkinおよび$check_in<=checkout、部屋は予約済み - または
$check_outの場合>=checkinおよび$check_out<=checkout、部屋は予約済み - または
$check_inの場合 <=checkinおよび$check_out>=checkout、部屋は予約済み
したがって、探している情報を取得するには、サブクエリでこれらのシナリオの両方を表す必要があります。
また、datetimeを使用することをお勧めします timeだけでなく、比較のために そうしないと、副作用が発生します。
編集:SQLクエリ
(いわば、猫の皮を剥ぐ方法は複数あることに注意してください。私は、あなたがすでに持っているものを可能な限り維持する例を提供しているだけです。繰り返しになりますが、checkin 、checkout 、$check_in 、および$check_out すべてdatetimeに解決されます タイプ)
SELECT *
FROM room
WHERE room_id NOT IN
(SELECT room_id
FROM bookings
WHERE
(checkin <= '$check_in' AND checkout >= '$check_in') OR
(checkin <= '$check_out' AND checkout >= '$check_out') OR
(checkin >= '$check_in' AND checkout <= '$check_out'))