Sulit untuk memberikan jawaban lengkap untuk Anda di sini, karena Anda hanya menunjukkan kepada kami tabel yang berisi pemesanan - kami tidak dapat mengetahui kisaran kamar yang tersedia.
SQL yang mengembalikan room_id untuk kamar yang dipesan setidaknya sebagian dari periode yang dipilih dapat berupa:
SELECT `room_id` , COUNT(*)
FROM `bookings`
WHERE `dt` BETWEEN "[start date]" AND "[end date]"
GROUP BY `room_id`;
Jika Anda memiliki tabel kamar (bukan pemesanan), Anda dapat mengembalikan daftar kamar yang tidak dipesan selama periode tersebut dengan:
SELECT `id`
FROM `rooms`
WHERE `id` NOT IN (
SELECT DISTINCT( `room_id` )
FROM `bookings`
WHERE `dt` BETWEEN "[start date]" AND "[end date]"
);
PERUBAHAN
Berdasarkan masukan dari OP, asumsinya sekarang adalah:
- Tabel berisi rincian kamar yang tersedia untuk periode yang dimulai pada tanggal di kolom
dt
dan berakhir pada hari berikutnya (yaitu kamar hotel) - Kueri harus mengembalikan semua kamar yang tersedia selama periode yang dimasukkan (jadi hanya kamar yang tersedia dari HARI A sampai HARI B yang akan dikembalikan.
Dengan demikian, kode yang diubah adalah:
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]"));