2016-07-22 28 views
1

我想從一個簡單的表像這樣得到的所有序列(大於1號)的開頭和結尾的結尾:開始,並將所有序列

CREATE TABLE `sequence` (
    `id` int(11) NOT NULL 
); 

INSERT INTO `sequence` (`id`) VALUES (1), (3), (4), (6), (7), (8), (10), (11), (12), (13), (15), (16), (17), (18), (19), (21), (22), (23), (24), (25), (26); 

參考this website,在尋找代替差距,我想獲得所有序列的'開始'和'停止'。所以,我希望這樣的結果:

+-----+----+ 
|start|stop| 
+-----+----+ 
| 3| 4| 
| 6| 8| 
| 10| 13| 
| 15| 19| 
| 21| 26| 
+-----+----+ 

我想出了以下查詢這使我開始位置的權利,而不是結束位置。

SELECT 
    start, stop 
FROM (
    SELECT 
    t1.id AS start, MIN(t3.id) AS stop 
    FROM 
    sequence t1 
    INNER JOIN sequence t2 ON t1.id + 1 = t2.id 
    LEFT OUTER JOIN sequence t3 ON t1.id < t3.id 
    GROUP BY 
    t1.id 
    ORDER BY 1 
) x 

WHERE 
    x.start NOT IN (
    SELECT 
     MIN(t3.id) AS stop 
    FROM 
     sequence t1 
     INNER JOIN sequence t2 ON t1.id + 1 = t2.id 
     LEFT OUTER JOIN sequence t3 ON t1.id < t3.id 
    GROUP BY 
     t1.id 
    ORDER BY 1 
) 
GROUP BY 
    start; 

任何人都可以指向正確的方向嗎?

回答

1

我找到了答案,我想與世界分享其中:

SELECT 
    l.id AS start, 
    (
    SELECT 
     MIN(a.id) AS id 
    FROM 
     sequence a 
     LEFT OUTER JOIN sequence b ON a.id + 1 = b.id 
    WHERE 
     b.id IS NULL 
     AND a.id >= l.id 
) AS stop 
FROM 
    sequence l 
    LEFT OUTER JOIN sequence r ON r.id + 1 = l.id 
WHERE 
    r.id IS NULL 

這也將採取「獨行俠」進去,但他們可以很容易地stop - start != 0被過濾掉。

相關問題