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%个完美的结果,也许我们可以帮助您改进它。在这是一个显示问题的范围内,考虑在应用程序代码中处理这些问题的方面。此外,(为什么)客户必须预订所有房间的相同天数。