mysql的数字的几个经典问题

本文深入探讨了SQL编程中处理数字辅助表与连续范围问题的高效方法,通过比较两种不同的实现方式,揭示了巧妙算法在提高执行效率上的重要作用。包括填充数字辅助表与查找不连续值的连续范围的SQL语句解析。

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


总结一下,这两个程序一个是用来计算连续值,一个是算出连续值,主要用了一些巧妙的算法。

转载于:https://my.oschina.net/zimingforever/blog/59922

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值