Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/60.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 查找免费房间(预订系统)_Mysql - Fatal编程技术网

Mysql 查找免费房间(预订系统)

Mysql 查找免费房间(预订系统),mysql,Mysql,对于预订系统,我有一张有房间、到达和离开的桌子 示例数据: id | room | arrival | departure ---+------+------------+----------- 1 | 1 | 2011-03-12 | 2011-03-14 2 | 1 | 2011-03-08 | 2011-03-09 3 | 1 | 2011-03-19 | 2011-03-20 4 | 2 | 2011-03-22 | 2011-03-30 5 |

对于预订系统,我有一张有房间、到达和离开的桌子

示例数据:

id | room | arrival    | departure
---+------+------------+-----------
1  | 1    | 2011-03-12 | 2011-03-14
2  | 1    | 2011-03-08 | 2011-03-09
3  | 1    | 2011-03-19 | 2011-03-20
4  | 2    | 2011-03-22 | 2011-03-30 
5  | 2    | 2011-03-19 | 2011-03-22
我现在的问题是:如果我有一个新的预订(
2011-03-10
2011-03-12
),我如何检查哪些房间是免费的


本例的输出应为房间
1
2

以下是一个查询,将显示某个日期范围内的非空闲房间:

select room from bookings where
(arrival<'2011-03-12' and departure>='2011-03-12') -- overlap at the end
OR (arrival<='2011-03-10' and departure>'2011-03-10') -- overlap at the start
OR (arrival>='2011-03-10' and departure<='2011-03-12') -- complete overlap

要查找空闲房间

也可以使用
BETWEEN
比较运算符。在这种情况下,您可以执行以下操作:

SELECT r.id FROM room r WHERE r.id NOT IN
(
    SELECT rb.room FROM room_booking rb WHERE 
        ('2011-03-10' BETWEEN rb.arrival AND rb.departure) OR 
        ('2011-03-12' BETWEEN rb.arrival AND rb.departure)
)

3号、4号和5号房间似乎也有空。(->你需要一张额外的桌子,基本上是现有房间的列表)好的,你说得对。。。。我仍然拥有这个完美的桌子。。。非常好:)我刚刚在第一个语句中添加了DISTINCT。这可以扩展为选择count(*)作为num,room from bookings。。。按房间分组:通过这种方式,它会告诉你碰撞的次数——如果你的酒店已经客满,碰撞的次数少可能会使你无法通过房间交换逃脱。(只是头脑风暴你的独特)我有一个非常类似的问题,并提出了你的解决方案。我一直在寻找其他的想法,当我看到你的答案时,我笑了。正是我在做的。酷:d此查询无法检测完全重叠:如果您预订了2011-03-10至2011-03-12的房间,您查询的2011-03-08至2011-03-14将显示该房间为免费房间,即您只更改开始和结束的重叠,但不更改完全重叠。不过,我会这样做:
('2011-03-10'+间隔1天)到达和离开之间以及到达和离开之间('2011-03-12'-间隔1天)
SELECT r.id FROM room r WHERE r.id NOT IN
(
    SELECT rb.room FROM room_booking rb WHERE 
        ('2011-03-10' BETWEEN rb.arrival AND rb.departure) OR 
        ('2011-03-12' BETWEEN rb.arrival AND rb.departure)
)