共有3个表格:建筑物,会议室,预订。
1栋= n个房间
1个房间= n个预订
表格构建 - ID (int),名称(varchar)
TABLE ROOMS - ID (int), building_id (int)
表格预留 - ID (int), room_id (int), date_start (日期时间), date_end (日期时间)
<pre>
ID name
1 Building A
2 Building B
3 Building C
</pre>
<pre>
ID building_id
1 1
2 1
3 2
4 3
</pre>
<pre>
ID room_id date_start date_end
1 1 2014-08-09 14:00:00 2014-08-09 14:30:00
2 1 2014-08-09 14:30:00 2014-08-09 15:30:00
3 3 2014-08-09 16:30:00 2014-08-09 17:30:00
4 2 2014-08-09 16:00:00 2014-08-09 17:00:00
5 3 2014-08-09 16:00:00 2014-08-09 16:30:00
</pre>
如何过滤所有在特定日期和时间至少有1间房间的建筑物?
例如,我们希望在2014-08-09 16:00:00至2014-08-09 17:00:00过滤所有拥有至少1个可用房间的建筑物。在这种情况下,它将显示构建A AND 构建C 可用。 A楼有1个免费房间, B楼还有1个免费房间,因为该房间没有预订。
有人可以帮我解决这个问题吗?我只是无法用一个MySQL查询来弄清楚所有建筑物。谢谢。
答案 0 :(得分:0)
尝试此查询
SELECT b.name,r.id,rv.date_start,rv.date_end FROM buildings b
LEFT JOIN rooms r ON b.id = r.building_id
LEFT JOIN reservataions rv ON rv.room_id = r.id
WHERE '2014-08-09 16:00:00' BETWEEN rv.date_start AND rv.date_end
答案 1 :(得分:0)
使用LEFT JOIN
将rooms
表连接到reservations
表,并在on
子句中添加时间条件。然后,查看没有匹配的地方 - 这些是可用的房间。
SELECT b.id, b.name, COUNT(*) as NumRoomsAvailable
FROM buildings b JOIN
rooms r
ON b.id = r.building_id LEFT JOIN
reservations rv
ON rv.room_id = r.id AND
'2014-08-09 16:00:00' BETWEEN rv.date_start AND rv.date_end
WHERE rv.room_id is null
GROUP BY b.id;
最后一步是按照建筑物进行汇总,而不是单独列出每个可用的房间。