0

我正在尝试制作一个简单的预订系统。我有一个名为的表reservation,其中包含预订时间和预订它的客户的 ID(请参阅下面的架构)。我还有另一张桌子room,这张桌子是房间类型的,所以每种类型的房间在这张桌子上都有一个关于它的大小和价格的条目。还有另一张桌子rooms,用于实际进入每个房间。在我尝试进行的查询中,我想选择一个房间,它是特定类型的,并且在给定的时间片内可用。像这样的东西;

Select number from rooms where type = 4 and available between $start-date and $end-date;

我不知道如何在查询的一部分之间编写可用的。我的架构的相关部分如下;

CREATE TABLE IF NOT EXISTS `reservation` (
  `rid` int(11) NOT NULL AUTO_INCREMENT, /* reservation id */
  `number` int(11) NOT NULL, /* number of the room for this reservation */
  `cid` int(11) NOT NULL, /* customer id */
  `begin` date NOT NULL,
  `end` date NOT NULL,
  PRIMARY KEY (`rid`),
);

CREATE TABLE IF NOT EXISTS `room` (
  `rid` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(50) COLLATE utf8_unicode_ci NOT NULL,
  `size` tinyint(3) unsigned NOT NULL,
  `price` float NOT NULL,
  PRIMARY KEY (`rid`)
);

CREATE TABLE IF NOT EXISTS `rooms` (
  `number` smallint(5) unsigned NOT NULL,
  `type` int(11) NOT NULL,
  `available` tinyint(1) NOT NULL,
  `cid` int(11) DEFAULT NULL,
  PRIMARY KEY (`number`),
);
4

2 回答 2

0

虽然与您所拥有的表结构不完全相同,但这是另一个预订查询的链接...您可以查看那里的方式/原因,但是您应该可以通过这样做来获得您正在寻找的东西...

SELECT DISTINCT        
      rooms.number
   FROM        
      rooms
         LEFT JOIN reservations res
            ON rooms.number = res.number
           AND (  res.begin between '2012-04-05' and '2012-04-08'                
               OR res.end between '2012-04-05' and '2012-04-08' )
   WHERE          
          rooms.type = 4
      AND res.number IS NULL   

前提是查看每个房间并在相关日期内专门寻找预订。如果任何保留或结束日期在该范围内,则其已被占用。如果没有,则没有预订,因此可用。因此,LEFT JOIN 将始终允许返回房间(提供类型 = 4),但也只有在预订表编号值为 NULL 时,表示文件上没有预订,没有记录,空匹配......房间是可用的。

于 2012-05-16T03:33:54.007 回答
0

我不确定这是否是一个好的解决方案,但我最终这样做了:

SELECT number, room.price
FROM rooms
JOIN room on room.rid = rooms.type 
WHERE rooms.type = ".$room_id."
AND rooms.number NOT IN (
    SELECT number FROM reservation
    WHERE end >= FROM_UNIXTIME(".$start.")
    AND begin <= FROM_UNIXTIME(".$end.")
) LIMIT 1;
于 2012-05-16T06:05:11.863 回答