之前发了一个mysql时间函数的几个经典问题,还有点没消化好,今天是两个关于数字的sql编程问题。一个是数字辅助表,一个是连续范围问题。
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.774ms
换另一种写法
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;
总结一下,这两个程序一个是用来计算连续值,一个是算出连续值,主要用了一些巧妙的算法。