繁体   English   中英

检查酒店房间的空房情况

[英]check availability of room in hotel

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

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

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

要在指定的时间段内(即'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

在这里演示

您应该使用这样的东西:

"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>比date和check_in <date。 如果您有多个保留,这将给您错误!

使用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个或多个保留。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM