SQL查询房间可用性检查

时间:2017-10-31 07:00:14

标签: php mysql

我正在尝试创建一个在线房间预订系统。

数据库的其中一个表应该包含预订。它有一个自动编号字段,客户数据字段,两个到达和离开的日期字段,另一个表预订详细信息包括:soldid,roomid和房间数。

搜索页面将到达和离开日期提交到结果页面,然后该结果页面应该告知客户该期间内有多少房间可用。这是一切都出错的地方。我无法准确计算所请求期间内已预订的客房数量。

预订表

id|guest  | arrive     | depart      
1 |Smith  | 2017-12-20 | 2017-12-25  
2 |Jones  | 2017-12-21 | 2017-12-25  
3 |Brown  | 2017-12-23 | 2017-12-27  
4 |White  | 2017-12-24 | 2017-12-26  

预订明细表

id     | booked_id | room_id |room_count
1      | 1         |  1      | 2
2      | 1         |  2      | 2
3      | 2         |  1      | 4
4      | 3         |  2      | 2
5      | 3         |  1      | 2
6      | 4         |  1      | 2

客房表 - 会议室room_id来自此处。

room_id | type        | count   |amount
1       | Single room |  10     | 1000
2       | Deluxe room |  5      | 2000

我想要一个特定的房间可用性(例如:room_id是1)

date        available     roomid
2017-12-20  |   8      |  1
2017-12-21  |   4      |  1
2017-12-22  |   4      |  1
2017-12-23  |   2      |  1
2017-12-24  |   0      |  1
2017-12-25  |   0      |  1
2017-12-26  |   4      |  1
2017-12-27  |   8      |  1
2017-12-28  |   10     |  1
2017-12-25  |   10     |  1

我也在使用日历表。我写了一个像

这样的查询
SELECT x.dt , r.room_cnt - COALESCE(SUM(d.`booking_cnt`),0) available
FROM calendar_table x
LEFT JOIN bookings y ON x.dt >= y.`date_from` AND x.dt < y.`date_to`
LEFT JOIN booking_details d ON d.booking_id=y.id
LEFT JOIN rooms r ON r.id= 1
WHERE x.dt BETWEEN now()  AND now() + interval 3 month GROUP BY dt

但这不能正常工作。

1 个答案:

答案 0 :(得分:1)

像这样修改查询,

SELECT x.dt , r.room_cnt,SUM(d.`booking_cnt`) booked,r.room_cnt- SUM(d.`booking_cnt`) available FROM calendar_table x
LEFT JOIN bookings y ON x.dt >= y.`date_from` AND x.dt < y.`date_to`
LEFT JOIN booking_details d ON d.booking_id=y.id and d.room_id='1'
LEFT JOIN rooms r ON r.id= 1
WHERE x.dt BETWEEN now()-interval 3 month AND now() + interval 3 month GROUP BY dt