3

因此,我正在设计一个适用于酒店的 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

4

2 回答 2

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)

于 2012-08-20T18:46:46.050 回答
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] 中)。

于 2013-02-08T12:09:31.217 回答