あなたが抱えている問題は、クエリが十分に堅牢ではないということです。問題を分解すると、次のようになります。
$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'))