Det problem, du har, er, at din forespørgsel ikke er tilstrækkelig robust. Når du nedbryder problemet, er det, du har, dette:
Hvis området defineret af $check_in
og $check_out
overlapper området defineret af checkin
og checkout
i enhver måde, så er værelset booket. Ellers er det gratis.
Det betyder, at:
- Hvis
$check_in
>=checkin
og$check_in
<=checkout
, værelset er BOOKET - ELLER Hvis
$check_out
>=checkin
og$check_out
<=checkout
, værelset er BOOKET - ELLER Hvis
$check_in
<=checkin
og$check_out
>=checkout
, værelset er BOOKET
Så du skal repræsentere begge disse scenarier i din underforespørgsel for at få den information, du leder efter.
Du vil forhåbentlig også bruge datetime
for dine sammenligninger og ikke kun time
, ellers vil du få bivirkninger.
EDIT:SQL-forespørgsel
(Husk på, at der er mere end én måde at flå en kat på, så at sige. Jeg giver bare et eksempel, der så meget som muligt holder med det, du allerede har. Endnu en gang går jeg også ud fra, at checkin
, checkout
, $check_in
, og $check_out
vil alle løses til datetime
typer)
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'))