以前發了一個mysql時間函數的幾個經典問題,還有點沒消化好,今天是兩個關於數字的sql編程問題。一個是數字輔助表,一個是連續範圍問題。mysql
A數字輔助表的問題是填充一張表,其中包含1-N的數算法
BEGIN DECLARE s int UNSIGNED DEFAULT 1; TRUNCATE TABLE testtable; WHILE s<= num DO BEGIN INSERT into testtable SELECT s; set s=s+1; END; end WHILE; END
輸入1000參數,執行很慢時間: 29.774mssql
換另外一種寫法編程
BEGIN DECLARE s int UNSIGNED DEFAULT 1; TRUNCATE TABLE testtable; WHILE s*2<= num DO BEGIN INSERT into testtable SELECT id+s from testtable; set s=s*2; END; end WHILE; END
效率很高。。。執行時間爲0.478ms
B 連續範圍問題是指一段數字爲不連續的,如何能找到連續範圍函數
SELECT id,@a :=@a+1 rn from testtable ,(select @a :=0) as a;
這條語句能夠現實不連續的值及所在的rownum
select b.id,b.rn,b.id-b.rn diff from ( SELECT id,@a :=@a+1 rn from testtable ,(select @a :=0) as a ) as b
這個語句查出來了全部的差值,而後根據這個差值groupby下。
select MIN(id) as min,MAX(id) as max from ( select b.id,b.rn,b.id-b.rn diff from ( SELECT id,@a :=@a+1 rn from testtable ,(select @a :=0) as a ) as b ) as c GROUP BY diff;