Mysql 仅使用一个表检查可用时间?

Mysql 仅使用一个表检查可用时间?,mysql,sql,Mysql,Sql,我只有一张桌子,上面有一张预定单。每个预订都有一个ID主键、一个房间号、一个开始时间和一个结束时间 我想知道在一定的时间范围内哪些房间是空的。所以,如果我想看看5-7点之间是否有空房间,我会搜索桌子,找到当时没有预订的房间 起初我以为我可以做到: SELECT DISTINCT roomNumber FROM `reservations` A WHERE NOT EXISTS ( SELECT NULL FROM `reservations` B WHERE A.roomNumber

我只有一张桌子,上面有一张预定单。每个预订都有一个ID主键、一个房间号、一个开始时间和一个结束时间

我想知道在一定的时间范围内哪些房间是空的。所以,如果我想看看5-7点之间是否有空房间,我会搜索桌子,找到当时没有预订的房间

起初我以为我可以做到:

SELECT DISTINCT roomNumber
FROM  `reservations` A
WHERE NOT 
EXISTS (

SELECT NULL 
FROM  `reservations` B
WHERE A.roomNumber = B.roomNumber
AND (
B.starttime >  '5:00:00'
AND B.starttime <  '7:00:00'
)
OR (
B.endtime >  '5:00:00'
AND B.endtime <  '7:00:00'
)
)
但我很快意识到为什么这不起作用。因为所有的预订都在同一个表中,如果它发现一行时间不冲突,它将返回房间号。这意味着,如果4号房间在5-7和3-4分别有预订,我的查询仍然会返回4号房间,因为3-4行在技术上根据我的情况评估为True


我无法修改该表,也不知道该怎么办,因为我从未遇到过类似的情况。

尝试将您的条件更改为这些条件

SELECT DISTINCT roomNumber
FROM  `reservations` A
WHERE NOT 
EXISTS (

SELECT NULL 
FROM  `reservations` B
WHERE A.court = B.court
AND (
B.starttime <  '7:00:00'
AND B.endtime >  '5:00:00'
)
)
简化查询:

SELECT DISTINCT roomNumber FROM reservations 
WHERE 
    (startTime NOT BETWEEN '05:00:00' AND '07:00:00')
AND (endTime   NOT BETWEEN '05:00:00' AND '07:00:00')

我认为这是可行的:

WITH ALL_ROOMS as (SELECT DISTINCT roomNumber
FROM  `reservations`),

BOOKED_ROOMS as (
SELECT DISTINCT A.roomNumber
FROM ALL_ROOMS A
LEFT JOIN
(SELECT roomNumber, starttime
FROM 'reservations') B
LEFT JOIN
(SELECT roomNumber, endtime
FROM 'reservations') C
)
WHERE (B.starttime > '5:00:00' AND B.starttime <  '7:00:00')
OR (B.endtime > '5:00:00' AND B.endtime <  '7:00:00')
)

SELECT A.roomNumber
from ALL_ROOMS A
LEFT JOIN BOOKED_ROOMS B
ON A.roomNumber = B.roomNumber
WHERE B.roomNumber is NULL
你可以试试这个

SELECT DISTINCT roomnumber 
FROM   `reservations` A 
WHERE  NOT EXISTS (SELECT NULL 
                   FROM   `reservations` B 
                   WHERE  A.roomnumber = B.roomnumber 
                          AND ( B.starttime NOT BETWEEN '05:00:00' AND '07:00:00') 
                          AND ( B.endtime NOT BETWEEN '05:00:00' AND '07:00:00') ) 

什么是法庭?给出一些示例数据以供理解。如果事件A在事件B结束之前开始,而在事件B开始之后结束,则可以说事件A与事件B重叠。你可以画一个简单的图表来证明这一点。我甚至不知道不在两者之间是一件事。非常感谢。对它进行了测试,它似乎很有效,但如果我将开始时间和结束时间设置为与现有预订完全相同的时间,它仍然会返回该房间。哦,拜托。不要说你不知道如何解决这个问题!请将>更改为>=和<抱歉,这是一个如此容易而变得困难的错误。请注意,一般而言,不相关子查询的性能优于相关子查询,但这仍然是一个优雅的解决方案。