【问题标题】:MySQL query booking system - remove entry if room is already bookedMySQL查询预订系统 - 如果房间已经预订,则删除条目
【发布时间】:2012-01-12 12:25:53
【问题描述】:

这两天我一直在努力解决这个问题(我是 MySQL 的新手,请耐心等待),但我无法绕过我想做的这个查询……首先是数据:

我有两张桌子,一张用于这样的房间:

  • 桌子房间
  • id_room |小房间 | view_room
  • 1.1 |单身 |海
  • 1.2 |单身 |国家
  • 1.3 |双 |海
  • 1.4 |双 |国家
  • 1.5 |单身 |海

  • 表预订

  • id_reservation |客户编号 | n_房间 |签到 |结帐
  • 1 | 1 | 1.1 | 2012-02-20 | 2012-02-24

如果有人想要预订带有 tipe_room=Singleview_room=Seacheck_in date=2012-02-15 的房间并且check_out date=2012-02-20 我希望它返回可用的 id_room(1.1 和 1.5)。

现在,如果有人想用 tipe_room=Singleview_room=Seacheck_in date=2012-02-19 预订房间并且 check_out date=2012-02-23 我希望它返回可用的 id_room(仅 1.5)。

我一直在尝试 JOIN 条件,但是当满足条件时,它会排除所有房间...

请问我该怎么做?

最好的问候,亚历克斯

【问题讨论】:

    标签: mysql


    【解决方案1】:

    此查询应检查所有四种占用情况(A、B、C 和 D):

      check_in     check_out
          |=TEST=PERIOD=|
    
      |--A--| |--B--| |--C--|  <- check_in<period_end AND check_out>period_start
        |--------D--------|    <- check_in<period_start AND check_out>period_end
    

    这是完整的查询:

    SELECT `id_room` FROM `rooms` 
    WHERE `tipe_room`='Single' AND `view_room`='Sea' 
    AND NOT EXISTS 
    (
    SELECT * FROM `reservations` WHERE `n_room`=`rooms`.`id_room` 
    AND ((`check_in`<'2012-02-20' AND `check_out`>'2012-02-15') 
     OR (`check_in`<'2012-02-15' AND `check_out`>'2012-02-20'))
    )
    

    【讨论】:

      【解决方案2】:

      试试这个查询

      select * from room where room.view = :view and room.type = :type
      and (select count(*) from reservation r where r.room_id = room.id and 
      (r.checkout > :checkin and r.checkin  < :checkout) or
      (r.checkin  < :checkin and r.checkout > :checkin))  = 0
      

      这里的主要思想是选择房间,然后在子选择中检查它是否尚未预订。

      【讨论】:

      • 一般来说,SELECT [NOT] EXISTS ...SELECT COUNT(...) ... 快得多,如果我们只需要检查某些数据的 [不] 存在。
      猜你喜欢
      • 1970-01-01
      • 2012-03-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-06-04
      相关资源
      最近更新 更多