[英]Rooms & Availability Dates PHP/MySQL
所以,我正在设计一个适用于酒店的 Web 应用程序,它最终应该成为一种简单的方法,可以通过一些额外的代码为每个酒店网站进行安装。 该应用程序正在使用 php 和 mysql 。 所以,正如您可能猜到的,我对数据库结构很困惑。 尽管如此,我已经做了一些研究,而且我不只是要求一个成熟的预订系统。
因此,酒店老板必须拥有多种类型的客房。 所以我想可能一张房间的桌子是“必须的”。 开始了:
---------- Rooms Table (example)
ID NAME ADULTS ROOM_COUNT PRICE/NIGHT
1 DoubleRoom 2 5 45$
2 Family 3 2 75$
3 Single 1 3 35$
这很简单。 可以通过我的应用程序添加房间,我还会附上适当的描述以及每个房间的各种图像。 但让我们回到正题。 人们应该这样预订...
---------- Bookings Table (example)
ID ROOM_ID BOOKING_USER CHECKIN (timestamp) CHECKOUT (timestamp)
1 2 A full name 208420842042 308230482042824
2 3 A full name 208423242525 529752972595272
...
所以,这是 -希望是 - 数据库结构。 现在,我正在考虑一种检查可用性的方法。 我知道,这听起来可能很愚蠢,但我想不出一个聪明而简单的方法。 在网站的形式中,应该有以下字段: check-in date
和check-out-date
,然后将转换为时间戳和..这是我卡住的时间!
当我只有上述表格时,如何检查房间的可用性。 有什么办法或者我需要改变我的数据库结构吗? 即使我设法检查可用性,房间总数( ROOM_COUNT
)是如何计数的? 我的意思是,我如何检查多种类型房间的可用性? 我想的是这样的:
SELECT count(ROOM_ID) FROM bookings WHERE
bookings.checkin < DATE_GIVEN_AS_CHECKIN_INPUT and
bookings.checkout > DATE_GIVEN_AS_CHECKOUT_INPUT
然后根据此查询的输出,我会知道是否有可用房间。 但是房间数呢? 有没有更好的办法?
如果这里有人可以启发我,我会很高兴。 提前致以最诚挚的问候和感谢,即使是阅读本文!
布兰
PS哦,这不是作业! :PI 反正不要去上学 :D
以下查询将查找所有没有预订的房间,或者在入住/结账输入之前或之后的预订。
SELECT r.*
FROM rooms r
LEFT JOIN bookins b ON b.room_id = r.id
WHERE b.id IS NULL
OR (b.checkout >= DATE_GIVEN_AS_CHECKIN_INPUT AND b.checkin >= DATE_GIVEN_AS_CHECKOUT_INPUT)
OR (b.checkout <= DATE_GIVEN_AS_CHECKIN_INPUT AND b.checkout <= DATE_GIVEN_AS_CHECKOUT_INPUT)
要获得房间数量,只需将SELECT r.*
替换为SELECT COUNT(DISTINCT r.id)
如果您在时间线中查看您请求的时间段 [SDATE,EDATE],则有四种预订情况 (1)、(2)、(3)、(4) 可以(全部/部分)占用请求的时间段:
SDATE EDATE
|--------| <-- requested period
|--1--| |--2--| <-- booking periods
|-----3------| <-- relevant for
|-4--| <-- occupancy test
|-5-| |--6--| <-- periods not relevant
您可以使用以下语句找到这些期间案例(1、2、3 和 4):
案例 1、2 和 3
WHERE (b.checkout >= SDATE AND b.checkin >= EDATE)
案例4:
WHERE (b.checkout <= SDATE AND b.checkin >= EDATE)
然后结合这两种情况,将列出给定时间段 [SDATE,EDATE] 内所有被占用房间的房间 ID 的查询是:
SELECT DISTINCT b.roomid FROM bookings AS b
WHERE (b.checout >= SDATE AND b.checkin <= EDATE)
OR (b.checkout <= SDATE AND b.checkin >= EDATE)
由于您需要相反的情况 - 请求期间的所有可用房间,您的查询将如下所示:
SELECT r.roomid FROM rooms AS r WHERE r.roomid NOT IN
(
SELECT b.roomid FROM bookings AS b
WHERE (b.checout >= SDATE AND b.checkin <= EDATE)
OR (b.checkout <= SDATE AND b.checkin >= EDATE)
)
子查询中不需要 DISTINCT(如果 1 不在 [1,2] 中,那么它也不在 [1,1,2] 中)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.