2013-07-25 72 views
1

我有一個巨大的表,有幾十萬條記錄。他們都有第一列的唯一編號,儘管有些編號在序列中缺失。Mysql,在一個序列中查找缺少的數字

我想顯示一個單獨丟失的數字列表。

因此,例如:

10029 
10032 
10034 
10036 

我試圖得到它顯示:

10030 
10031 
10033 
10035 

,我發現這個查詢,但它似乎缺少數字時,有一個範圍:

SELECT t1.id+1 AS Missing 
FROM data AS t1 
LEFT JOIN data AS t2 
    ON t1.id+1 = t2.id 
WHERE t2.id IS NULL 

結果:

10030 
10033 

正如您所見,10031和10035在該列表中缺失。

+1

這個問題應該幫助:http://stackoverflow.com/questions/1389605/sql-find-missing-ids-in-a-table – mcriecken

+0

如果你可以創建一個臨時表,包含'min(id )'到'max(id)',你可以在它們之間做一個左連接。 – Barmar

+0

有沒有一種方法可以在查詢中完成而不創建另一個表?我試圖儘可能簡單地做到這一點,所以我可以在PHP查詢中使用它。 我看到另一個使用的例子: SELECT a.order_id + 1 AS start,MIN(b.order_id) - 1 AS end – Scott

回答

0

也許是這樣的一個起點。沒測試過,但可能只是工作

SELECT @min := (SELECT min(id) FROM yourtable); // get the smallest ID in the table 
SELECT @last := @min; // cache the min value for the where clause 

SELECT id, id - @last AS difference, @last := id 
FROM yourtable 
WHERE id > @min 
ORDER BY id ASC 
HAVING difference > 1 

它不會給你個人失蹤的ID,但它會告訴你哪裏的差距,以及如何大他們。