检查酒店房间的可用性

时间:2016-02-23 07:09:09

标签: php sql

我的数据库中有两个表。第一张桌子是房间,第二张桌子是预订。在我的房间表中

id room_no type rate
1  13       1b  1000
2  14       2b  2000
3  15       3b  3000
4  16       1b  1000
5  17       2b  2000
6  18       3b  3000

在我的预订表中

id room_no check_in     check_out
1   13     23-2-2016     24-2-2016
2   14     24-2-2016     25-2-2016
1   13     25-2-2016     26-2-2016
1   13     27-2-2016     29-2-2016
1   13     1-3-2016      2-3-2016
1   13     7-3-2016      7-3-2016

"SELECT room_no,type,rate 
             FROM room 
             WHERE room_no not in 
             (select IFNULL(GROUP_CONCAT(room_no),0) 
             FROM reservation 
             WHERE check_out >= '$check_in' AND check_in <= '$check_out')"

当我选择24-2-2016到27-2-2016的日期时,它会显示

room_no check_in     check_out

  14     24-2-2016     25-2-2016
  15     25-2-2016     26-2-2016
  16     27-2-2016     29-2-2016
  17     1-3-2016      2-3-2016
  18     7-3-2016      7-3-2016

但我想要所有可用的房间。

3 个答案:

答案 0 :(得分:4)

要获得指定期间的占用房间,即'2016-02-27'-'2016-02-24',您可以使用:

SELECT DISTINCT room_no
FROM reservation
WHERE check_in <= '2016-02-27' AND check_out >= '2016-02-24'

<强>输出:

room_no
=======
13
14

要获得可用的房间,您可以使用上述查询:

SELECT *
FROM room
WHERE room_no NOT IN (
   SELECT DISTINCT room_no
   FROM reservation
   WHERE check_in <= '2016-02-27' AND check_out >= '2016-02-24')

<强>输出:

id, room_no, type, rate
=======================
3,   15,     3b,   3000
4,   16,     1b,   1000
5,   17,     2b,   2000
6,   18,     3b,   3000

Demo here

答案 1 :(得分:0)

你应该使用这样的东西:

"SELECT room_no, type, rate 
         FROM room 
         WHERE room_no not in 
         (select room_no FROM reservation 
         WHERE  ('$check_in' BETWEEN check_in AND check_out) AND ('$check_out' BETWEEN check_in AND check_out))"

我不知道查询是否正确,但你肯定要检查它们之间。 你不能只测试check_out&gt;比日期和check_in&lt;日期。如果您有多个预订,这将给您错误!!

答案 2 :(得分:0)

使用LEFT JOIN应该不使用子查询就可以了。

这样的事情:

SELECT 
    room.room_no,
    room.`type`,
    room.rate,
    COUNT(reservation.room_no) AS countReservation
FROM 
    room
LEFT JOIN reservation
    ON (room.room_no = reservation.room_no) 
        AND (check_in <= '2016-02-24' AND check_out >= '2016-01-27')
GROUP BY 
    room.room_no
HAVING 
    countReservation = 0

此查询的另一个优势是额外的列countReservation,它甚至可以告诉您是否有针对每个会议室的给定时间范围的1个或多个预订。