予約を含むテーブルのみを表示しているため、ここで完全な答えを見つけるのは困難です。利用可能な部屋の範囲を知ることはできません。
選択した期間の少なくとも一部で予約された部屋のroom_idを返すSQLは、次のようになります。
SELECT `room_id` , COUNT(*)
FROM `bookings`
WHERE `dt` BETWEEN "[start date]" AND "[end date]"
GROUP BY `room_id`;
(予約ではなく)部屋のテーブルがある場合は、その期間中に予約されていない部屋のリストを次のように返すことができます。
SELECT `id`
FROM `rooms`
WHERE `id` NOT IN (
SELECT DISTINCT( `room_id` )
FROM `bookings`
WHERE `dt` BETWEEN "[start date]" AND "[end date]"
);
修正
OPによるフィードバックに基づいて、仮定は次のようになります。
- この表には、列
dt
の日付から始まる期間に利用可能な部屋の詳細が含まれています。 翌日終了(ホテルの部屋など) - クエリは、入力された期間のエンティティに利用可能なすべての部屋を返す必要があります(したがって、A日からB日まで利用可能な部屋のみが返されます。
そのため、修正されたコードは次のとおりです。
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]"));