【问题标题】:How to select available date slice如何选择可用的日期切片
【发布时间】:2012-05-16 03:09:01
【问题描述】:

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

【问题讨论】:

  • 你应该加入roomsreservation并查询你的开始日期和结束日期之间的预订数量。

标签: mysql select join temp-tables


【解决方案1】:

虽然与您的表结构不完全相同,但这里是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 时,表示文件上没有预订,没有记录,空匹配......房间是可用。

【讨论】:

    【解决方案2】:

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

    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;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-11-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-06-25
      • 2021-05-21
      • 2015-09-03
      相关资源
      最近更新 更多