After reading your comment, I think I understand the problem a bit better. As a first step I would generate a matrix of meeting rooms and time slots using cross join:
select * from ( select distinct start_date , end_date from @meeting_detail ) ts cross join @meeting_room mr
Then, for each cell in the matrix, add meetings in that timeslot:
left join @meeting_detail md on mr.id = md.meeting_room_id and ts.start_date < md.end_date and md.start_date < ts.end_date
And then demand that there are no free rooms. For example, by saying that the left join must succeed for all rooms and time slots. A left join succeeds if any field is not null:
group by mr.building_no , ts.start_date , ts.end_date having max(case when md.meeting_room_id is null then 1 else 0 end) = 0
Here's a complete working example. It's written for SQL Server, and the table variables (@meeting_detail) won't work in MySQL. But the report generating query should work in most databases:
set nocount on declare @meeting_room table (id int, roomname varchar(50), building_no int) declare @meeting_detail table (meeting_room_id int, start_date datetime, end_date datetime) insert @meeting_room (id, roomname, building_no) select 1, 'Kitchen', 6 union all select 2, 'Ballroom', 6 union all select 3, 'Conservatory', 7 union all select 4, 'Dining Room', 7 insert @meeting_detail (meeting_room_id, start_date, end_date) select 1, '2010-08-01 9:00', '2010-08-01 10:00' union all select 1, '2010-08-01 10:00', '2010-08-01 11:00' union all select 2, '2010-08-01 10:00', '2010-08-01 11:00' union all select 3, '2010-08-01 10:00', '2010-08-01 11:00' select mr.building_no , ts.start_date , ts.end_date from ( select distinct start_date , end_date from @meeting_detail ) ts cross join @meeting_room mr left join @meeting_detail md on mr.id = md.meeting_room_id and ts.start_date < md.end_date and md.start_date < ts.end_date group by mr.building_no , ts.start_date , ts.end_date having max(case when md.meeting_room_id is null then 1 else 0 end) = 0
This prints:
building_no start end 6 2010-08-01 10:00:00.000 2010-08-01 11:00:00.000