以前发了一个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;