我有一个包含两个表的数据库:
tbl_rooms (id, name)
tbl_reservations (uid, room_id, start_date, end_date)
现在,我可以轻松找到特定日期范围内的可用房间,例如 2023-08-01 至 2023-08-07。
但我想要的是编写查询,如果所有房间在 2023-08-01 / 2023-08-07 期间都不可用,它将返回第一个可用房间。如果客户要求入住 7 天,可以退回至少可入住 7 天的可用房间。
谢谢,希望能帮到你!
要找到特定日期范围内的第一个可用房间,您可以在 tbl_rooms 和 tbl_reservations 表之间使用左连接,然后过滤出特定日期范围内的预订房间。
要找到至少 7 天可用的第一个可用房间,您可以使用子查询查找在所需日期范围内可用的所有房间,然后过滤掉至少 7 天不可用的房间。
SELECT r.id, r.name
FROM tbl_rooms r
LEFT JOIN tbl_reservations res ON r.id = res.room_id AND
((res.start_date <= '2023-08-01' AND res.end_date >= '2023-08-01') OR
(res.start_date >= '2023-08-01' AND res.start_date <= '2023-08-07'))
WHERE res.uid IS NULL AND
DATEDIFF('2023-08-07', '2023-08-01') + 1 <= (
SELECT COUNT(*)
FROM tbl_reservations res2
WHERE res2.room_id = r.id AND
((res2.start_date <= '2023-08-01' AND res2.end_date >= '2023-08-01') OR
(res2.start_date >= '2023-08-01' AND res2.start_date <= '2023-08-07'))
)
ORDER BY r.id ASC
LIMIT 1
如果所有房间在 2023-08-01 / 2023-08-07 期间不可用,则此查询将返回至少 7 天可用的第一个可用房间的 ID 和名称。