如何使用多个表检查所选日期内的记录?

时间:2014-08-09 15:01:42

标签: mysql sql join multiple-columns multiple-tables

这是我之前的一个问题已经回答了。

有4个表:建筑物,房间,预订,信息

1栋= n个房间
1个房间= n个预订

TABLE BUILDINGS - ID(int),name(varchar)
TABLE ROOMS - ID(int),building_id(int)
表保留 - ID(int),room_id(int),date_start(datetime),date_end(datetime)
表信息 - ID(int),building_id(int),hours_start(int),hours_end(int)

建筑物表示例

ID    name
1     Building A
2     Building B
3     Building C

房间表示例

ID    building_id
1     1
2     1
3     2
4     3

预订表示例

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

信息表示例

ID    building_id   hours_start   hours_end
1     1             9             22
2     2             8             20
3     3             8             22

问题

我们可以在任何时间过滤在选定日期至少有1个可用房间的建筑物吗?建筑物的工作时间可能不同(信息表)。

1 个答案:

答案 0 :(得分:1)

我认为这会做你想要的。它计算所有房间的建筑物中的会议时间总数。然后计算总会议时间。如果一个房间可用,第二个小于第一个房间:

SELECT b.id, b.name,
       sum(timestampdiff(minute, rv.date_start, rv.date_end))/60 as MeetingHours,
       max(hours_end - hours_start)*count(distinct r.id) as BuildingHours
FROM buildings b JOIN
     information bi
     on b.id = bi.building_id
     rooms r
     ON b.id = r.building_id LEFT JOIN
     reservations rv
     ON rv.room_id = r.id AND
        '2014-08-09' between date(rv.date_start) AND date(rv.date_end)
GROUP BY b.id
HAVING MeetingHours is Null or MeetingHours < BuildingHours;