Mysql 如何选择可用的日期片

Mysql 如何选择可用的日期片,mysql,select,join,temp-tables,Mysql,Select,Join,Temp Tables,我想做一个简单的预订系统。我有一个名为reservation的表,它保存了预订时间和预订时间的客户id,请参见下面的模式。我还有另一个桌子房间,这张桌子是为房间类型准备的,所以每种类型的房间在这张桌子上都有一个条目,记录它的大小和价格。和另一个桌子房间,用于每个房间的实际入口。在我尝试进行的查询中,我想选择一个房间,它是特定类型的,并且在给定的时间片中可用。像这样的东西 Select number from rooms where type = 4 and available between $

我想做一个简单的预订系统。我有一个名为reservation的表,它保存了预订时间和预订时间的客户id,请参见下面的模式。我还有另一个桌子房间,这张桌子是为房间类型准备的,所以每种类型的房间在这张桌子上都有一个条目,记录它的大小和价格。和另一个桌子房间,用于每个房间的实际入口。在我尝试进行的查询中,我想选择一个房间,它是特定类型的,并且在给定的时间片中可用。像这样的东西

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`),
);

虽然不是完全相同的表结构,但这里的你可以回顾如何/为什么有,但你应该可以通过做得到你想要的

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   

前提是查看每个房间,特别是在相关日期内寻找预订。如果任何预订或结束日期在该范围内,则其已占用。如果没有,则没有预订,因此可用。因此,如果type=4,左连接将始终允许返回房间,但也仅当预订表编号值为NULL时,表示文件上没有预订、没有记录、空匹配。。。房间是空的。

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

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;
您应该加入rooms and reservation,并查询开始日期和结束日期之间的预订数量。