0

我花了超过 14 个小时试图找到一种方法来实现这一点,但没有运气!

我正在开发一个预订系统,我有 2 张桌子:

Rooms
---------
ID - ROOM_TYPE - NAME - ROOM_COUNT
1       1   single room      6
2       2   double room      4
3       3   studio           2


Booking
---------
ID - ROOM_TYPE - Customer_NAME  - CHECK_IN  - CHECK_OUT
1       3         John   A           1-1-2013      4-1-2013
2       3         John   B           2-1-2013      5-1-2013             
3       2         John   C           8-1-2013      9-1-2013              

在用户输入 2 个日期来搜索可用房间后,我进行查询以显示我拥有的所有类型房间,我有 3 种类型(单人/双人/工作室),每种类型都有酒店可用的房间数量(例如:酒店默认有6间单人房)

我最终得到这个查询以获取所有可用的类型房间

            SELECT * 
            FROM rooms              
             where id NOT IN 
                 ( SELECT room_type FROM  booking 
                    WHERE "'.$check_in.'"  <= check_out
                    AND "'.$check_out.'"  >= check_in                                             
                  )  

我需要制定另一个条件,即预订中的 WHERE count(room_type) 少于 ROOMS 表中 ROOM_COUNT 字段中保存的值..

取决于上面的表格结构,酒店只有两个工作室,并且在 2013 年 4 月 1 日都不可用 .. 因此,当有人在该日期搜索时,查询不应该显示工作室类型房间 ..

我需要计算每种房型的预订数量,然后显示结果..

先感谢您

4

1 回答 1

0

这是想法。您需要知道在此期间入住的最大房间数。您可以通过查看当天之前的入住人数减去退房人数来获得在任何一天入住的房间数量。

接下来,要获得最大值,我们只需要查看签入日(因为签出会降低最大值)。以下是在任何一天签到的最大值:

select r.room_type, r.room_count, r.room_count - RoomsTaken
from Rooms r join
     (select room_type, max(Num_CheckOuts - num_CheckIns) as RoomsTaken
      from (select b.*,
                   (select count(*) from booking b2 where b2.room_type = b.room_type and b2.check_in <= b.check_out
                   ) as num_CheckIns,
                   (select count(*) from booking b2 where b2.room_type = b.room_type and b2.check_out <= b.check_in
                   ) as Num_CheckOuts
            from booking b
           ) b
      where $check_in <= check_out and $check_out >= check_in
      group by room_type
     ) b
     on r.room_type = b.room_type

(注意:此查询未经测试,因此可能存在语法错误。)

它使用相关子查询来获取累积计数。在其他数据库中,窗口函数可能用于此目的。

于 2013-01-27T16:02:24.907 回答