失蹤的ID我在MySQL有這個表,例如:的MySQL得到表
ID | Name
1 | Bob
4 | Adam
6 | Someguy
如果您發現,沒有ID號(2,3和5)。
我該如何編寫一個查詢,以便MySQL只回答丟失的ID,在這種情況下:「2,3,5」?
失蹤的ID我在MySQL有這個表,例如:的MySQL得到表
ID | Name
1 | Bob
4 | Adam
6 | Someguy
如果您發現,沒有ID號(2,3和5)。
我該如何編寫一個查詢,以便MySQL只回答丟失的ID,在這種情況下:「2,3,5」?
SELECT a.id+1 AS start, MIN(b.id) - 1 AS end
FROM testtable AS a, testtable AS b
WHERE a.id < b.id
GROUP BY a.id
HAVING start < MIN(b.id)
希望這個環節也有助於 http://www.codediesel.com/mysql/sequence-gaps-in-mysql/
一個比較有效的查詢:
SELECT (t1.id + 1) as gap_starts_at,
(SELECT MIN(t3.id) -1 FROM my_table t3 WHERE t3.id > t1.id) as gap_ends_at
FROM my_table t1
WHERE NOT EXISTS (SELECT t2.id FROM my_table t2 WHERE t2.id = t1.id + 1)
HAVING gap_ends_at IS NOT NULL
謝謝伊萬。這運行速度非常快! – MikeC
這對我來說很有效,只不過它錯過了從id = 1開始的初始差距 – egprentice
上面的查詢將會給兩列,所以你可以嘗試這種在單個列拿到丟失號碼
select start from
(SELECT a.id+1 AS start, MIN(b.id) - 1 AS end
FROM sequence AS a, sequence AS b
WHERE a.id < b.id
GROUP BY a.id
HAVING start < MIN(b.id)) b
UNION
select c.end from (SELECT a.id+1 AS start, MIN(b.id) - 1 AS end
FROM sequence AS a, sequence AS b
WHERE a.id < b.id
GROUP BY a.id
HAVING start < MIN(b.id)) c order by start;
對於這個單列版本,我得到了(例如)'475','477','506','508','513 '但是在兩欄版本中,它使我得到了'[475,475]','[477,506]','[508,513]'這告訴我我缺少數字475,477-506和508-513。 –
要添加一點到伊萬的答案,第是版本顯示數字開始時如果1不存在:
SELECT 1 as gap_starts_at,
(SELECT MIN(t4.id) -1 FROM testtable t4 WHERE t4.id > 1) as gap_ends_at
FROM testtable t5
WHERE NOT EXISTS (SELECT t6.id FROM testtable t6 WHERE t6.id = 1)
HAVING gap_ends_at IS NOT NULL limit 1
UNION
SELECT (t1.id + 1) as gap_starts_at,
(SELECT MIN(t3.id) -1 FROM testtable t3 WHERE t3.id > t1.id) as gap_ends_at
FROM testtable t1
WHERE NOT EXISTS (SELECT t2.id FROM testtable t2 WHERE t2.id = t1.id + 1)
HAVING gap_ends_at IS NOT NULL;
工作正常:),但對大數據非常緩慢:( – iiic