Det er svært at komme med et fuldstændigt svar til dig her, da du kun viser os tabellen, som indeholder bookingerne - vi kan ikke vide, hvilket udvalg af værelser der er til rådighed.
SQL, som returnerer room_id'erne for værelser, der er booket i mindst en del af den valgte periode, kunne være:
SELECT `room_id` , COUNT(*)
FROM `bookings`
WHERE `dt` BETWEEN "[start date]" AND "[end date]"
GROUP BY `room_id`;
Hvis du havde en tabel med værelser (i stedet for bookinger), ville det være muligt for dig at returnere en liste over værelser, der ikke var booket i den pågældende periode med:
SELECT `id`
FROM `rooms`
WHERE `id` NOT IN (
SELECT DISTINCT( `room_id` )
FROM `bookings`
WHERE `dt` BETWEEN "[start date]" AND "[end date]"
);
ÆNDRING
Baseret på feedback fra OP er antagelserne nu:
- Tabellen indeholder detaljer om lokaler, der er tilgængelige i en periode, der starter på datoen i kolonne
dt
og slutter den følgende dag (dvs. hotelværelser) - Forespørgslen skal returnere alle lokaler, der er tilgængelige for hele den indtastede periode (så kun lokaler, der er tilgængelige fra DAG A til DAG B, vil blive returneret.
Som sådan er den ændrede kode:
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]"));