CREATE TEMPORARY TABLE Temp1 select a.ring_event_id, a.event_name, a.ring_id, a.start_time, ADDTIME(a.start_time, time_per_dog * count(b.dog_id)) as end_time, count(b.dog_id) as num_dogs from ring_event a, tda b where a.ring_event_id = b.ring_event_id group by a.ring_event_id; CREATE TEMPORARY TABLE Temp2 select a.ring_event_id, a.event_name, a.ring_id, a.start_time, ADDTIME(a.start_time, time_per_dog * count(b.dog_id)) as end_time, count(b.dog_id) as num_dogs from ring_event a, tda b where a.ring_event_id = b.ring_event_id group by a.ring_event_id; select ring_event_id, person.name, group_concat(skill.skill) as skills from person join skill_entry on person.person_id = skill_entry.person_id join skill on skill_entry.skill_id = skill.skill_id join ring_event where person.person_id not in ( select person.person_id from tda a join dog on a.dog_id = dog.dog_id join person on dog.person_id = person.person_id join Temp1 b on a.ring_event_id = b.ring_event_id join Temp2 c on (b.start_time < c.end_time and b.end_time > c.start_time) where b.ring_event_id = ring_event.ring_event_id ) group by ring_event_id, name order by ring_event_id, name; drop table Temp1; drop table Temp2;