Das Problem, das Sie haben, ist, dass Ihre Abfrage nicht robust genug ist. Wenn Sie das Problem aufschlüsseln, erhalten Sie Folgendes:
Wenn der durch $check_in
definierte Bereich und $check_out
den durch checkin
definierten Bereich überlappt und checkout
in beliebigen Übrigens, dann ist das Zimmer gebucht. Andernfalls ist es kostenlos.
Das bedeutet:
- Wenn
$check_in
>=checkin
und$check_in
<=checkout
, das Zimmer ist GEBUCHT - ODER Wenn
$check_out
>=checkin
und$check_out
<=checkout
, das Zimmer ist GEBUCHT - ODER Wenn
$check_in
<=checkin
und$check_out
>=checkout
, das Zimmer ist GEBUCHT
Sie müssen also beide Szenarien in Ihrer Unterabfrage darstellen, um die gesuchten Informationen zu erhalten.
Außerdem verwenden Sie hoffentlich datetime
für Ihre Vergleiche und nicht nur time
, sonst treten Nebenwirkungen auf.
BEARBEITEN:SQL-Abfrage
(Denken Sie daran, dass es sozusagen mehr als eine Möglichkeit gibt, eine Katze zu häuten. Ich liefere nur ein Beispiel, das so weit wie möglich mit dem übereinstimmt, was Sie bereits haben. Ich gehe auch hier davon aus, dass checkin
, checkout
, $check_in
, und $check_out
werden alle zu datetime
aufgelöst Typen)
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'))