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>=checkinet$check_in<=checkout, la salle est RÉSERVÉE - OU Si
$check_out>=checkinet$check_out<=checkout, la salle est RÉSERVÉE - OU Si
$check_in<=checkinet$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'))