只用一张表检查可用时间?

时间:2017-02-25 16:26:05

标签: mysql sql

我有一张表,它有一个预订列表。每个预订都有ID(主键)roomNumberstartTimeendTime

我试图找出在特定时间范围内可用的房间。因此,如果我想看看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行在技术上根据我的条件评估为真。

我无法修改表格而且我不知道该怎么做,因为我从来没有遇到过这样的事情。

4 个答案:

答案 0 :(得分:1)

尝试将条件更改为这些条件。

import numpy as np
from itertools import permutations

counter = 0
sett = 0
rle = []

matrix = np.zeros(200)

for i in range (0,200):
    matrix[i] = 1
    for j in permutations(matrix):
        for k in j:
            if k == 1:
               counter += 1
            else:
               if counter > sett:
                  sett == counter
               counter == 0
        rle.append(sett)

答案 1 :(得分:0)

简化查询:

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')

Demo

答案 2 :(得分:-1)

我认为这样可行:

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

答案 3 :(得分:-1)

你可以试试这个

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') )