在选择房间可用性时使用MySQL查询

use*_*666 1 php mysql sql

在房间预订方面,我在酒店预订中有此数据库结构

下面是我的桌子 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  
Run Code Online (Sandbox Code Playgroud)

下表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
Run Code Online (Sandbox Code Playgroud)

在这种情况下,所有豪华房都从预订2014-06-012014-06-06。然后,我通过使用以下MySQL代码选择了2014年6月1日至2014年6月6日可用的豪华间

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'
Run Code Online (Sandbox Code Playgroud)

但是显示的是豪华房号。在上面所选日期范围之前和之后预订的112和113,而不是0或已满。有解决此代码的解决方案吗?

geo*_*tef 5

我认为您必须同时检查两个日期才能入住和退房:

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')
   )
Run Code Online (Sandbox Code Playgroud)

重新编辑答案并创建一个sqlfiddle进行测试