Het is moeilijk om hier een volledig antwoord voor je te bedenken, omdat je ons alleen de tabel laat zien die de boekingen bevat - we kunnen niet weten welke kamers beschikbaar zijn.
SQL die de room_id's retourneert voor kamers die voor ten minste een deel van de geselecteerde periode zijn geboekt, kan zijn:
SELECT `room_id` , COUNT(*)
FROM `bookings`
WHERE `dt` BETWEEN "[start date]" AND "[end date]"
GROUP BY `room_id`;
Als u een tabel met kamers had (in plaats van boekingen), zou u een lijst kunnen terugsturen van kamers die in die periode niet zijn geboekt met:
SELECT `id`
FROM `rooms`
WHERE `id` NOT IN (
SELECT DISTINCT( `room_id` )
FROM `bookings`
WHERE `dt` BETWEEN "[start date]" AND "[end date]"
);
AMENDEMENT
Op basis van de feedback van OP zijn de aannames nu:
- De tabel bevat details van kamers die beschikbaar zijn voor een periode die begint op de datum in kolom
dt
en eindigend de volgende dag (dwz hotelkamers) - De zoekopdracht moet alle kamers retourneren die beschikbaar zijn voor de gehele ingevoerde periode (dus alleen kamers die beschikbaar zijn van DAG A tot DAG B worden geretourneerd.
Als zodanig is de gewijzigde code:
SELECT room_id
FROM available_rooms
WHERE dt BETWEEN "[start date]" AND DATE_SUB("[end date]",INTERVAL 1 DAY)
GROUP BY room_id
HAVING COUNT(*)=ABS(DATEDIFF("[start date]","[end date]"));