所以,我正在设计一个适用于酒店的网络应用程序,最终应该成为一个简单的方法,为每个酒店网站安装一些额外的代码。该应用程序使用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
然后根据此查询的输出,我会知道是否有可用的房间。但是房间数呢?有没有更好的方法?
如果有人能在这方面让我感到高兴,我真的很高兴。最好的问候和提前感谢,即使是阅读本文! BLANE
P.S。哦,这不是作业! :P无论如何我都不去上学:D
答案 0 :(得分:5)
以下查询将查找所有没有预订的房间,或在登记/结账输入之前或之后的预订。
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)
答案 1 :(得分:2)
如果您在时间表中查看所请求的期限[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]中。)