【问题标题】:Using MySQL query in selecting room availability在选择房间可用性时使用 MySQL 查询
【发布时间】:2014-07-14 06:09:41
【问题描述】:

我在酒店预订中的房间可用性方面有这个数据库结构

下面是我的room表格

room_num    roomtype     
101         Single    
102         Single    
103         Single    
111         Deluxe    
112         Deluxe   
113         Deluxe    
114         Deluxe    
115         Deluxe    
116         Deluxe    
121         Superior  
122         Superior  

下面的表格是room_booked是记录预订房间号

dor 是入住日期,dco 是退房日期

room_num        dor         dco
  111        2014-06-01  2014-06-06
  112        2014-06-01  2014-06-06
  113        2014-06-01  2014-06-06
  114        2014-06-01  2014-06-06
  115        2014-06-01  2014-06-06
  116        2014-06-01  2014-06-06
  112        2014-05-18  2014-05-21
  113        2014-08-01  2014-08-04

在这种情况下,所有豪华客房都从2014-06-01 预订到2014-06-06。然后我使用下面的 MySQL 代码选择了 2014-06-01 至 2014-06-06 可用的豪华房

SELECT
    room.room_num
FROM
    room
LEFT JOIN
    room_booked ON room_booked.room_num = room.room_num
WHERE
    (
        (
            dor IS NULL AND dco IS NULL
        )
        OR (
            -- wished booking date is before DOR
            '2014-06-06' < dor
            -- OR wished booking date is after DCO
            OR '2014-06-01' >=  dco
        )
    )
    -- room type
    AND roomtype = 'Deluxe'

但它显示的是豪华房号。 112 和 113 在上述选定日期范围之前和之后预订,而不是 0 或完全预订。有没有办法修复这个代码?

【问题讨论】:

  • 你想在这两个日期之间获得豪华房还是什么?
  • 将 left join 更改为 inner join
  • 我想从2014-06-01到2014-06-06入住豪华房。然而,它显示的豪华房也在 5 月和 8 月预订,而不是显示 0 或已满。我已更改为内部联接,但没有更改

标签: php mysql sql


【解决方案1】:

我认为您必须检查入住和退房的两个日期:

SELECT
    room.room_num
FROM
    room
WHERE
  roomtype = 'Deluxe' AND
  room.room_num not in 
  (
    SELECT
      room_booked.room_num
    FROM
      room_booked
    WHERE
      (room_booked.dor<='2014-06-1' and room_booked.dco>='2014-06-1')
      OR
      (room_booked.dor<'2014-06-06' and room_booked.dco>='2014-06-06')
      OR
      (room_booked.dor>='2014-06-01' and room_booked.dco<'2014-06-06')
   )

重新编辑答案并创建sqlfiddle 用于测试

【讨论】:

  • 我已经在我的案例中进行了测试,但它仍然是一样的。房间号 112 和 113 仍然出现
  • @user3573666 你是对的 room_booked 双打结果中的多个记录,请参阅更新
猜你喜欢
  • 2013-01-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-07-16
  • 2016-08-12
  • 2013-01-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多