繁体   English   中英

SQL查询以从表中选择在日期范围内仍具有可用容量的所有房间

[英]SQL query to select all rooms from a table which still have free capacity in date range

我正在为旅馆开发预订系统。 每个房间内都有不同数量的床(room.capacity)。 例如,不同的预订可能共享一个带有三张床的单人间。 单个预订也有可能占用整个房间并容纳其容量,甚至可能占用不同房间的多张床。 这个想法不是在经典的酒店预订系统中以“每个房间”为基础进行预订,而是在我的系统中,所有工作均以“每床”为基础。 基本上,您在后端添加一个新房间并定义一个容量,而不是添加每张单人床。 不必知道谁拥有哪张床,而是知道哪个房间以及是否达到了容量限制,或者房间中是否还有剩余房间,这一点很重要。

我正在寻找一种方法,根据“客房预订”中的条目来选择所有客房及其容量+可用床位。

我尝试了一个小时的大型查询,例如:

SELECT room.id, room.name, room.room_category_id, room.status, room.capacity 
FROM room
WHERE (SELECT COUNT(reservation_room.id) 
       FROM reservation_room 
       WHERE reservation_room.id = room.id) AND 
WHERE (SELECT reservation.start, reservation.end 
       FROM reservation 
       WHERE NOT reservation.start > date$1 AND
             NOT reservation.end < $date2 
      UNION 
      SELECT COUNT(id) AS beds_available 
      FROM reservation_room 
      WHERE reservation_room.id = room.id;

桌子布置

我认为这非常接近:

SELECT r.id, r.name, r.room_category_id, r.status, r.capacity, r.capacity - IFNULL(COUNT(res.id), 0) AS beds_available
FROM room AS r
LEFT JOIN reservation_room as rr ON rr.room_id = r.id
LEFT JOIN reservation as res
     ON res.id = rr.reservation_id
     AND @range_start < res.end
     AND @range_end > res.start
GROUP BY r.id

唯一的问题是,在此期间,如果同一房间有两个不重叠的预订,这将使可用床数减少两次。 我不确定如何对所有预订进行排序,以便仅重叠的预订会增加床位使用量。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM