2012-03-28 52 views
1

我想知道是否有任何方法來選擇第一個數字不是在一系列數字中採取的,就像你使用MAX()選擇最高的數字。(我的)SQL:選擇第一個數字不是在一系列數字中,類似於MAX()

比方說,你有一列「ID」,而插入1,2,3,5,6,8,10,...

如果使用MAX()將返回10.是有一種方法來選擇4(因爲它是第一個免費號碼),填充4,然後選擇7(5,6已採取,因此7將是下一個...)

謝謝您提前! :)

+2

可能的重複[如何找到與SQL運行計數器「間隙」](http://stackoverflow.com/questions/1312101/how-to-find-a-gap-in-running-counter- with-sql) – 2012-03-28 12:34:16

+0

哦,謝謝塞爾吉奧!我知道這個問題一定是在某個地方問過,但無法弄清楚這些關鍵詞來搜索:) – Chris 2012-03-28 12:37:47

+0

不客氣:) – 2012-03-28 12:39:16

回答

4

這應該做到這一點 -

SELECT t1.id + 1 
FROM tbl t1 
LEFT JOIN tbl t2 
    ON t1.id + 1 = t2.id 
WHERE t2.id IS NULL 
ORDER BY t1.id ASC 
LIMIT 1 
+0

謝謝你nnichols! :) – Chris 2012-03-28 12:59:02

0

你到底想幹什麼?如果您試圖爲要插入的新行創建唯一的ID,那麼有更好的方法來完成它。

你可以做什麼nnichols建議,或者你可以做到這一點,如果你不想加入:

set @i=0; 
select if(@i=id,@i:=id+1,@i) from tb1 order by id; 
select @i; 

非常有用的,如果你有一個大表,不想加入。

注意:這將返回多個結果集。你的應用程序代碼應該使用正確的。 出於安全原因,默認情況下可能會禁用多行查詢,您必須在驅動程序或數據庫配置中覆蓋這些設置(小心)。

+0

thx,Priyank ...這是什麼語言?我使用php和mysql ...從來沒有見過這個,這就是爲什麼我問:) – Chris 2012-03-28 14:29:40

+0

這是可以在MySQL上運行的SQL。 @i是一個會話變量,所以即使另一個線程觸發相同的查詢,它也會使用@i的不同副本 – Dojo 2012-03-28 14:48:48

1

嘗試此查詢

SELECT MIN(table0.id)+1 AS newid 
FROM tst AS table0 
LEFT JOIN tst table1 ON table1.id=table0.id+1 
WHERE table1.id IS NULL 
1

這裏是Dojo的解決方案的修改。它避免使用多個結果集。

set @i=0; 
select max(if(@i=id,@i:=id+1,@i)) from tb1 order by id; 

我更喜歡這個答案,因爲它讓我可以選擇從哪裏開始尋找一個缺失的數字。

相關問題