mysql的數字的幾個經典問題

以前發了一個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;


總結一下,這兩個程序一個是用來計算連續值,一個是算出連續值,主要用了一些巧妙的算法。
相關文章
相關標籤/搜索