首页 > 代码库 > mysql - 缺失范围和连续范围
mysql - 缺失范围和连续范围
初始化数据
# 创建表DROP TABLE IF EXISTS g;CREATE TABLE g( a INT)ENGINE=INNODB;# 初始化数据INSERT INTO g SELECT 1;INSERT INTO g SELECT 2;INSERT INTO g SELECT 3;INSERT INTO g SELECT 100;INSERT INTO g SELECT 101;INSERT INTO g SELECT 103;INSERT INTO g SELECT 104;INSERT INTO g SELECT 105;INSERT INTO g SELECT 106;
对于g表其缺失范围如4-16所示
对于g表其连续范围如4-17所示
对于缺失范围的问题,可以通过下列步骤来解决
1)找到间断点之前的值,然后对该值加1,即为start_range;
2)找到间断点之前的值,然后对该值减1,即为end_range;
对于间断点之前的值,可以用如下sql:
SELECT aFROM g AS AWHERE NOT EXISTS( SELECT * FROM g AS B WHERE A.a+1=B.a)
查出的106是无用的,因为它是表中的最大值,所以将其过滤掉。断点之前的值,对该值加1操作,即为start_range,可以通过以下sql语句得到:
SELECT a+1 start_rangeFROM g AS AWHERE NOT EXISTS( SELECT * FROM g AS B WHERE A.a+1=B.a) AND a < (SELECT MAX(a) FROM g)
最后通过子查询为每个最小间断点返回表g中下一个已有的值并减一,即得到间断点end_range,最终sql语句如下所示:
SELECT a+1 start_range, ( SELECT MIN(a)-1 FROM g C WHERE C.a > A.a) AS end_rangeFROM g AS AWHERE NOT EXISTS( SELECT * FROM g AS B WHERE A.a+1=B.a) AND a < (SELECT MAX(a) FROM g)
这只是该问题的解决方案之一,更为简单直观的方法是,将表g中的数据进行移位匹配,如果是连续的值,那么其差值应该为1,如果不是连续的值就应该大于1。
~~待更新
mysql - 缺失范围和连续范围
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。