mysql查询预订系统

时间:2013-01-27 10:59:40

标签: mysql

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

我正在预订系统,我有两张桌子:

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字段中保存的值少。

取决于上面的桌子结构,酒店只有两个工作室,所有都没有在4-1-2013 .. 所以,当有人在那个日期搜索时,查询不应该显示工作室类型的房间..

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

提前谢谢

1 个答案:

答案 0 :(得分: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

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

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