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

时间:2015-05-01 21:11:19

标签: mysql sql database

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

我正在寻找一种方法来选择所有房间的容量+可用床位,具体取决于reservation_room中的条目。

我尝试了几个小时的大量查询,如:

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;

table layout

1 个答案:

答案 0 :(得分:0)

我认为这非常接近:

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

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