如果所有房间在要求的时间内都被占用,则找到第一个可用房间

问题描述 投票:0回答:1

我有一个包含两个表的数据库:

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 天的可用房间。

谢谢,希望能帮到你!

javascript mysql sql rdbms
1个回答
0
投票

要找到特定日期范围内的第一个可用房间,您可以在 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 和名称。

© www.soinside.com 2019 - 2024. All rights reserved.