Twój problem polega na tym, że Twoje zapytanie nie jest wystarczająco niezawodne. Kiedy rozwiążesz problem, masz to:
Jeśli zakres zdefiniowany przez $check_in
i $check_out
nakłada się na zakres zdefiniowany przez checkin
i checkout
w dowolnym sposób, wtedy pokój jest zarezerwowany. W przeciwnym razie jest bezpłatny.
Oznacza to, że:
- Jeśli
$check_in
>=checkin
i$check_in
<=checkout
, pokój jest ZAREZERWOWANY - LUB Jeśli
$check_out
>=checkin
i$check_out
<=checkout
, pokój jest ZAREZERWOWANY - LUB Jeśli
$check_in
<=checkin
i$check_out
>=checkout
, pokój jest ZAREZERWOWANY
Musisz więc przedstawić oba te scenariusze w swoim podzapytaniu, aby uzyskać informacje, których szukasz.
Miejmy nadzieję, że będziesz używać datetime
do porównań, a nie tylko time
, w przeciwnym razie wystąpią skutki uboczne.
EDYCJA:Zapytanie SQL
(Pamiętaj, że istnieje więcej niż jeden sposób na oskórowanie kota, że tak powiem. Po prostu podaję przykład, który zachowuje jak najwięcej tego, co już masz. Po raz kolejny zakładam, że checkin
, checkout
, $check_in
i $check_out
wszystko zmieni się na datetime
typy)
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'))