这是我之前的一个问题已经回答了。
有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个可用房间的建筑物吗?建筑物的工作时间可能不同(信息表)。
答案 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;