Le problème que vous rencontrez est que votre requête n'est pas suffisamment robuste. Lorsque vous décomposez le problème, vous obtenez ceci :
Si la plage définie par $check_in
et $check_out
chevauche la plage définie par checkin
et checkout
dans tout chemin, alors la chambre est réservée. Sinon, c'est gratuit.
Cela signifie que :
- Si
$check_in
>=checkin
et$check_in
<=checkout
, la salle est RÉSERVÉE - OU Si
$check_out
>=checkin
et$check_out
<=checkout
, la salle est RÉSERVÉE - OU Si
$check_in
<=checkin
et$check_out
>=checkout
, la salle est RÉSERVÉE
Vous devez donc représenter ces deux scénarios dans votre sous-requête afin d'obtenir les informations que vous recherchez.
De plus, vous utiliserez, espérons-le, datetime
pour vos comparaisons et pas seulement time
, sinon vous aurez des effets secondaires.
EDIT :Requête SQL
(Gardez à l'esprit qu'il existe plus d'une façon d'écorcher un chat, pour ainsi dire. Je ne fais que donner un exemple qui correspond autant que possible à ce que vous avez déjà. Encore une fois, je suppose également que checkin
, checkout
, $check_in
, et $check_out
résoudra tous en datetime
types)
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'))