我有一张表,它有一个预订列表。每个预订都有ID
(主键)roomNumber
,startTime
和endTime
。
我试图找出在特定时间范围内可用的房间。因此,如果我想看看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行在技术上根据我的条件评估为真。
我无法修改表格而且我不知道该怎么做,因为我从来没有遇到过这样的事情。
答案 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')
答案 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') )