То, что у вас есть, - это набор множеств, и вы хотите определить, имеют ли какие-либо из них ненулевые пересечения.Это именно тот вопрос, который задают при попытке найти всех предков узла во вложенном наборе.
Мы можем доказать, что для каждого перекрытия по крайней мере одно временное окно будет иметь начальное время, которое попадает во вседругие перекрывающиеся временные окна.Используя этот лакомый кусочек, нам не нужно создавать искусственные временные интервалы в течение дня.Просто возьмите время начала и посмотрите, пересекается ли оно с любым другим временным окном, а затем просто подсчитайте количество пересечений.
Так, каков запрос?
/*SELECT*/
SELECT DISTINCT
MAX(overlapping_windows.start_time) AS overlap_start_time,
MIN(overlapping_windows.end_time) AS overlap_end_time ,
(COUNT(overlapping_windows.id) - 1) AS num_overlaps
FROM user_times AS windows
INNER JOIN user_times AS overlapping_windows
ON windows.start_time BETWEEN overlapping_windows.start_time AND overlapping_windows.end_time
GROUP BY windows.id
ORDER BY num_overlaps DESC;
В зависимости от вашей таблицыразмер и то, как часто вы планируете запускать этот запрос, возможно, стоит добавить к нему пространственный индекс (см. ниже).
UPDATE
Если вы часто выполняете этот запрос, вынужно использовать пространственный индекс.Из-за обхода, основанного на диапазоне (т. Е. Время начала_падающего находится между диапазоном начала / конца), индекс BTREE ничего не сделает для вас.ЭТО ДОЛЖНО БЫТЬ ПРОСТРАНСТВЕННЫМ.
ALTER TABLE user_times ADD COLUMN time_windows GEOMETRY NOT NULL DEFAULT 0;
UPDATE user_times SET time_windows = GeomFromText(CONCAT('LineString( -1 ', start_time, ', 1 ', end_time, ')'));
CREATE SPATIAL INDEX time_window ON user_times (time_window);
Затем вы можете обновить предложение ON в приведенном выше запросе следующим образом:
ON MBRWithin( Point(0,windows.start_time), overlapping_windows.time_window )
Это даст вам индексированный обход запроса.Опять же, делайте это только в том случае, если вы планируете часто выполнять запрос.
Зачислите пространственный индекс на блог Кассони .