用于检查房间可用性的 SQL 查询
Posted
技术标签:
【中文标题】用于检查房间可用性的 SQL 查询【英文标题】:SQL query for room availability check 【发布时间】:2017-10-31 07:00:14 【问题描述】:我正在尝试创建一个在线客房预订系统。
数据库的一个表应该保存预订。它有一个自动编号字段、客户数据字段、到达和离开的两个日期字段,以及另一个表预订详细信息:bookedid、roomid 和房间计数。
搜索页面将到达和离开日期提交到结果页面,然后应该告诉客户在此期间有多少房间可用。这就是一切都出错的地方。我只是无法准确计算在请求的期限内已预订的房间数量。
预订表
身份证|客人|到达|离开 1 |史密斯 | 2017-12-20 | 2017-12-25 2 |琼斯 | 2017-12-21 | 2017-12-25 3 |棕色 | 2017-12-23 | 2017-12-27 4 |白色 | 2017-12-24 | 2017-12-26预订详情表
编号 |预订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 | 2Rooms table - Room room_id
来自这里。
我想要一个特定的房间可用性(例如:room_id 为 1)
可用日期 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
但这不能正常工作。
【问题讨论】:
无法将客人与预订的房间联系起来,也许您也应该显示日历表的结构。 我猜这行< y.date_to
需要说 <= y.date_to
所以它包括预订的最后一天。
x.dt between y.date_from AND y.date_to
也应该可以工作。
除此之外:询问“请帮助我”的问题往往是寻求高度本地化的指导,或者在某些情况下,寻求持续或私人帮助,这不适合我们的问答形式。它也相当模糊,最好用更具体的问题代替。请阅读Why is “Can someone help me?” not an actual question? 谢谢!
【参考方案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
【讨论】:
这看起来很有帮助。为了让它变得更好(并作为您未来答案的一般建议),您会考虑添加对您所做更改的解释吗?你的策略/方法是什么?如果他们的注意力被吸引到答案中的代码和问题中的代码之间的关键区别上,那么未来的读者会得到最好的服务。谢谢!以上是关于用于检查房间可用性的 SQL 查询的主要内容,如果未能解决你的问题,请参考以下文章