如何使用多个表检查是否未使用特定日期时间?

时间:2014-08-09 12:10:09

标签: php mysql datetime multiple-columns multiple-tables

共有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查询来弄清楚所有建筑物。谢谢。

2 个答案:

答案 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 JOINrooms表连接到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;

最后一步是按照建筑物进行汇总,而不是单独列出每个可用的房间。