Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql查询酒店客房可用性_Mysql - Fatal编程技术网

Mysql查询酒店客房可用性

Mysql查询酒店客房可用性,mysql,Mysql,我正在尝试为一家小酒店创建一个在线客房预订系统。数据库的一个表 应该保留预订。它有一个自动编号字段、客户数据字段、两个到达和离开日期字段以及一个预订房间数量的数字字段。 搜索页面将到达和离开日期提交到结果页面,然后该页面应该告诉客户在这段时间内有多少房间可用(如果有的话)。这就是问题所在。 我只是无法准确统计在要求的时间内已经预订的房间数量 guest | arrive | depart |booked Smith | 2002-06-11 | 2002-06-18

我正在尝试为一家小酒店创建一个在线客房预订系统。数据库的一个表 应该保留预订。它有一个自动编号字段、客户数据字段、两个到达和离开日期字段以及一个预订房间数量的数字字段。 搜索页面将到达和离开日期提交到结果页面,然后该页面应该告诉客户在这段时间内有多少房间可用(如果有的话)。这就是问题所在。 我只是无法准确统计在要求的时间内已经预订的房间数量

guest  | arrive     | depart       |booked
Smith  | 2002-06-11 | 2002-06-18   | 1
Jones  | 2002-06-12 | 2002-06-14   | 2
Brown  | 2002-06-13 | 2002-06-16   | 1
White  | 2002-06-15 | 2002-06-17   | 2
如果酒店有9间客房,这里有一份每日可用客房数量清单。 我想要这样的结果

 date        available     status
2002-06-10  |   9      |  Hotel is empty
2002-06-11  |   8      |  Smith checks in
2002-06-12  |   6      |  Jones checks in
2002-06-13  |   5      |  Brown checks in
2002-06-14  |   7      |  Jones checks out
2002-06-15  |   5      |  White checks in
2002-06-16  |   6      |  Brown checks out
2002-06-17  |   8      | White checks out
2002-06-18  |   9      | Smith checks out

请帮我找到一个解决方案

对于这种性质的问题,日历表并不是绝对必要的,但它们可以帮助以快速简单的方式对问题进行概念化。所以我有一张日历表,上面有1900年到4000年的日期等等

DROP TABLE IF EXISTS my_table;

CREATE TABLE my_table
(booking_id INT NOT NULL AUTO_INCREMENT PRIMARY KEY
,guest VARCHAR(12) NOT NULL
,arrive DATE NOT NULL
,depart DATE NOT NULL
,booked INT NOT NULL
,UNIQUE KEY(guest,arrive)
);

INSERT INTO my_table (guest,arrive,depart,booked) VALUES
('Smith','2002-06-11','2002-06-18',1),
('Jones','2002-06-12','2002-06-14',2),
('Brown','2002-06-13','2002-06-16',1),
('White','2002-06-15','2002-06-17',2);

SELECT x.dt
     , 9 - COALESCE(SUM(booked),0) available 
  FROM calendar x 
  LEFT 
  JOIN my_table y 
    ON x.dt >= y.arrive AND x.dt < y.depart 
 WHERE x.dt BETWEEN '2002-06-10' AND '2002-06-20' 
 GROUP 
    BY dt;
+------------+-----------+
| dt         | available |
+------------+-----------+
| 2002-06-10 |         9 |
| 2002-06-11 |         8 |
| 2002-06-12 |         6 |
| 2002-06-13 |         5 |
| 2002-06-14 |         7 |
| 2002-06-15 |         5 |
| 2002-06-16 |         6 |
| 2002-06-17 |         8 |
| 2002-06-18 |         9 |
| 2002-06-19 |         9 |
| 2002-06-20 |         9 |
+------------+-----------+
11 rows in set (0.00 sec)
如果存在my_表,则删除表;
创建表格my_表格
(预订id INT非空自动增量主键
,guest VARCHAR(12)不为空
,到达日期不为空
,出发日期不为空
,不为空
,唯一密钥(来宾,到达)
);
在my_表中插入(客人、到达、离开、预订)值
(‘史密斯’、‘2002-06-11’、‘2002-06-18’、1),
(‘琼斯’、‘2002-06-12’、‘2002-06-14’、2),
(‘布朗’、‘2002-06-13’、‘2002-06-16’、1),
(‘白色’、‘2002-06-15’、‘2002-06-17’、2);
选择x.dt
,9-合并(总计(记账),0)可用
从日历x开始
左边
加入我的桌子
在x.dt>=y.到达和x.dt请张贴您当前使用的查询,它不产生100%个完美的结果,也许我们可以帮助您改进它。在这是一个显示问题的范围内,考虑在应用程序代码中处理这些问题的方面。此外,(为什么)客户必须预订所有房间的相同天数。