Проблемът, който имате, е, че вашата заявка не е достатъчно стабилна. Когато разбиете проблема, това, което имате, е следното:
Ако диапазонът, дефиниран от $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'))