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