2011-12-07 42 views
3

我需要一些合併重疊間隔的幫助。與MySQL合併間隔

我有這個表:

 
id start  end 
1 15:30:00 16:20:00 
2 10:00:00 13:00:00 
3 15:00:00 16:09:00 
4 11:00:00 14:00:00 
5 16:20:00 16:30:00 

SQL:

CREATE TABLE `intervals` (
    `id` int(11) NOT NULL AUTO_INCREMENT, 
    `start` time NOT NULL, 
    `end` time NOT NULL, 
    PRIMARY KEY (`id`) 
) ENGINE=MyISAM DEFAULT CHARSET=latin1; 

INSERT INTO `intervals` (`start`, `end`) VALUES 
('15:30:00', '16:20:00'), 
('10:00:00', '13:00:00'), 
('15:00:00', '16:09:00'), 
('11:00:00', '14:00:00'), 
('16:20:00', '16:30:00'); 

而且我想輸出是這樣的:

 
id start  end 
2 10:00:00 14:00:00 
3 15:00:00 16:30:00 

只有開始和結束時間事; ID列基本可以忽略。

PHP https://stackoverflow.com/a/4347215/1085872也有類似的實現(直到第2步),但我只需要實現與MySQL的合併。

+0

請注意,應該合併的一些範圍(例如本例中的ID 3和5)本身不會重疊。要合併它們,您需要傳遞關閉「重疊」關係。在SQL中計算閉包通常是不可能的。爲什麼限制SQL解決方案? – outis

+0

同意,使用編程語言計算間隔更容易。 – ajreal

+0

找到了SQL解決方案,它是最好的答案在http://stackoverflow.com/questions/8451925/merging-intervals-in-one-pass-in-sql – servermanfail

回答

-1

嘗試這一個 -

SELECT MIN(i.start) start, MAX(i.end) end FROM 
    (
    SELECT @a:[email protected] + 1 a, t1.start, GREATEST(t1.end, t2.end) AS end 
    FROM (SELECT @a := 0) t, intervals t1 
    JOIN intervals t2 ON t1.id <> t2.id and t1.start >= t2.start and t1.start < t2.end 
) p 
    JOIN intervals i 
    ON (i.start BETWEEN p.start AND p.end) OR (i.end BETWEEN p.start AND p.end) 
    GROUP BY p.a; 

+----------+----------+ 
| start | end  | 
+----------+----------+ 
| 10:00:00 | 14:00:00 | 
| 15:00:00 | 16:30:00 | 
+----------+----------+ 

的查詢基於該解決方案 - http://www.artfulsoftware.com/infotree/queries.php#807

測試其上的數據。

+0

我試過這個更復雜的一組重疊的數據,它失敗了。例如1-4,2-5,3-6,10-11失敗。 – servermanfail