如何选择可用的日期切片

时间:2012-05-16 03:09:02

标签: mysql select join temp-tables

我正在尝试制作一个简单的预订系统。我有一个名为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`),
);

2 个答案:

答案 0 :(得分:0)

虽然不是你所拥有的完全相同的表结构,但是这里的another link to a reservation query... 你可以查看其中的方式/原因,但是你可以通过这样做来获得你想要的东西......

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时,表示没有文件保留,没有记录,空匹配...房间IS可用。

答案 1 :(得分: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;