【问题标题】:mysql query for a booking system预订系统的mysql查询
【发布时间】:2013-01-27 10:59:39
【问题描述】:

我已经花费了 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) from booking LESS 小于 ROOMS 表中 ROOM_COUNT 字段中保存的值..

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

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

提前谢谢你

【问题讨论】:

  • 无论如何,您的逻辑是有缺陷的 - 如果有人在搜索范围开始后签出特定房间类型,而其他人在搜索范围结束之前签入,那么这两个预订可能是容纳在同一个房间,但您的逻辑会将其视为该期间不可用的两个房间。我认为你可能需要重新考虑......
  • 实际上,我正试图用两张桌子尽可能地简化它。如果我在这里没有得到答案,我会尝试其他方法:(,谢谢大卫。跨度>
  • 由于可用房间的数量可能每天都在变化,因此您必须在查询中包含一个日期表,以便您可以找到每个日期的可用房间数量。

标签: mysql


【解决方案1】:

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

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

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

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

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

【讨论】:

  • Gordon,谢谢你,很抱歉迟到了,实际上,这是处理这个问题的第五天,似乎没有运气,或者我必须改变我的逻辑或数据库结构。当我尝试您的代码时,我没有得到任何结果.. 我正在尝试理解您的代码,所以我可以更改它直到让它工作.. 再次感谢您的时间,非常感谢 :)
  • 我所需要的只是:在给定日期内在预订表中搜索并将每个(房间类型)的结果保存在变量(计数)中,然后从房间表中选择 *,其中 room_count 少“
猜你喜欢
  • 1970-01-01
  • 2015-02-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多