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;


总结一下,这两个程序一个是用来计算连续值,一个是算出连续值,主要用了一些巧妙的算法。
相关文章
相关标签/搜索