你好,我有2个桌子的房间和预订,但我的桌子结构有点不同, 在预订表中有roomid,日期,状态,例如:
101,2012-12-10,0
101,2012-12-11,0
101,2012-12-12,1
101,2012-12-13,0
102,2012-12-10,0
102,2012-12-11,0
102,2012-12-12,0
我希望在2012-12-10和2012-12-13之间找到可用的房间 根据这个要求,只有102号房间应该返回。
我试过
SELECT id
FROM status
WHERE status='0'
AND date between '2012-12-10' AND '2012-12-13'
GROUP BY id
它不起作用,因为即使只找到一个可用行,它也会返回101
所以101可用于2012-12-11然后显示可用但不适合我们的数据范围。
答案 0 :(得分:1)
如果日期有与之相关的时间,您需要执行以下操作:
SELECT id
FROM status
WHERE status='0'
AND date between '2012-12-10 00:00:00' AND '2012-12-13 23:59:59'
GROUP BY id
您也可以使用日期(日期)而不是包括时间,但这可能效率较低。
答案 1 :(得分:1)
您应该可以使用以下内容:
SELECT roomid
FROM status s1
WHERE status='0'
AND date between '2012-12-10' AND '2012-12-13'
and not exists (select roomid
from status s2
where status='1'
AND date between '2012-12-10' AND '2012-12-13'
and s1.roomid = s2.roomid)
GROUP BY roomid
答案 2 :(得分:1)
试试这个:
SELECT rd.*
FROM room_details rd
INNER JOIN (SELECT DISTINCT roomid FROM bookings
WHERE roomid NOT IN (SELECT roomid FROM bookings
WHERE STATUS =0 AND DATE BETWEEN '2012-12-10' AND '2012-12-13')
) AS a ON rd.roomid = a.roomid
答案 3 :(得分:1)
这将选择在您选择的时间间隔内没有status=1
行的所有房间。请注意,我没有使用between
:如果status=1
在12月13日,该空间仍然在该时间间隔内可用,这就是我使用>= and <
的原因:
SELECT roomid
FROM status
WHERE `date` >= '2012-12-10'
AND `date` < '2012-12-13'
GROUP BY roomid
HAVING sum(status.status=1)=0
如果您的桌子中可能还有一些遗失的日子,如果这意味着房间没有预订但也无法使用,您也可以使用此查询:
SELECT roomid
FROM status
WHERE `date` >= '2012-12-10'
AND `date` < '2012-12-13'
AND status=0
GROUP BY roomid
HAVING count(*)=DATEDIFF('2012-12-13', '2012-12-10')
检查间隔中的天数是否等于status = 0的行数。
答案 4 :(得分:0)
SQL BETWEEN条件将返回表达式在value1和value2(包括)范围内的记录。因此,对于上述查询,应返回行101,2012-12-10,0
。
答案 5 :(得分:0)
试试这个:
SELECT roomid
FROM status
WHERE 'date_from' <= "2012-12-10" AND 'date_to' > "2012-12-10" AND 'status'= 0;