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 a
FROM g AS A
WHERE NOT EXISTS(
    SELECT *
    FROM g AS B WHERE A.a+1=B.a
)

查出的106是无用的,因为它是表中的最大值,所以将其过滤掉。断点之前的值,对该值加1操作,即为start_range,可以通过以下sql语句得到:

SELECT a+1 start_range
FROM g AS A
WHERE 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_range
FROM g AS A
WHERE NOT EXISTS(
    SELECT *
    FROM g AS B WHERE A.a+1=B.a
) AND a < (SELECT MAX(a) FROM g)

这只是该问题的解决方案之一,更为简单直观的方法是,将表g中的数据进行移位匹配,如果是连续的值,那么其差值应该为1,如果不是连续的值就应该大于1。

~~待更新

时间: 2024-10-08 16:15:04

mysql - 缺失范围和连续范围的相关文章

MySQL缺失mysql_config文件

打算爬虫,安装mysqldb 结果使用pip安装出错 在centos-6.4上pip install mysql-python,报错如下[[email protected] mysql-python]$ pip install mysql-python Downloading/unpacking mysql-python Running setup.py egg_info for package mysql-python sh: /usr/bin/mysql_config: No such fi

MYSQL主键自动增加的配置

文章一 原文地址: http://ej38.com/showinfo/mysql-202971.html 文章二:   点击转入第二篇文章 在数据库应用,我们经常要用到唯一编号.在MySQL中可通过字段的AUTO_INCREMENT属性来自动生成.MySQL支持多种数据表,每种数据表的自增属性都有所不同. ISAM表 如果把一个NULL插入到一个AUTO_INCREMENT数据列里去,MySQL将自动生成下一个序列编号.编号从1开始,并1为基数递增. 当插入记录时,没有为AUTO_INCREME

mysql 清空或删除表数据后,控制表自增列值的方法

http://blog.sina.com.cn/s/blog_68431a3b0100y04v.html 方法1: truncate table 你的表名 //这样不但将数据全部删除,而且重新定位自增的字段 方法2: delete from 你的表名 dbcc checkident(你的表名,reseed,0) //重新定位自增的字段,让它从1开始 方法3: 如果你要保存你的数据,介绍你第三种方法,by QINYI 用phpmyadmin导出数据库,你在里面会有发现哦 编辑sql文件,将其中的自

MySQL 多实例管理

根据配置文件创建目录 [[email protected] redis]# mkdir -pv /data/mysql/mysql_3307/{data,logs,tmp} mkdir: created directory `/data/mysql/mysql_3307' mkdir: created directory `/data/mysql/mysql_3307/data' mkdir: created directory `/data/mysql/mysql_3307/logs' mkd

MYSQL删除表的记录后如何使ID从1开始

MYSQL删除表的记录后如何使ID从1开始 MYSQL删除表的记录后如何使ID从1开始 http://hi.baidu.com/289766516/blog/item/a3f85500556e2c09728da5e1.html 2009-11-30 14:24 方法1:truncate table 你的表名//这样不但将数据全部删除,而且重新定位自增的字段 方法2:delete from 你的表名dbcc checkident(你的表名,reseed,0) //重新定位自增的字段,让它从1开始

mysql自增字段重排 mysql删除表后自增字段从1开始

MyISAM数据表 删除最大编号的记录后,该编号不可重用. 可在建表时可用"AUTO_INCREMENT=n"选项来指定一个自增的初始值. 可用alter table table_name AUTO_INCREMENT=n命令来重设自增的起始值. 其他: 由于删除了某些记录行,所以自增字段不连续了 1,3,4,5,7,10这样子 ------------------------- truncate命令是会把自增的字段还原为从1开始的,或者你试试把table_a清空,然后取消自增,保存,

浅谈秒级故障切换!用MHA轻松实现MySQL高可用(三)

MySQL复制是异步或者半同步的.当master故障时,一些slave可能并没有收到最新的relay log,也就意味着每个slave可能处于不同的状态.手动处理这些一致性问题是小事,因为不修复这些问题,就不能开始复制.但是手动修复这些问题,花费一个小时或更多的时间并不少见. 一主一从 如果架构是一主一从,就不会出现一部分slave的状态落后于最新的slave的问题.当master出现故障,可以将应用的流量全部发送给新的master(原来的slave).故障切换很容易解决.但是会有下面的问题.

MySQL高可用之MHA—其它高可用解决方案和问题

在上一篇的MHA介绍中提及过其它一些MySQL的高可用解决方案,只是略微介绍了以下,在这里详细的介绍. MySQL复制是异步或者半同步的.当master故障时,一些slave可能并没有收到最新的relay log,也就意味着每个slave可能处于不同的状态.手动处理这些一致性问题是小事,因为不修复这些问题,就不能开始复制.但是手动修复这些问题,花费一个小时或更多的时间并不少见. 一主一从 如果架构是一主一从,就不会出现一部分slave的状态落后于最新的slave的问题.当master出现故障,可

用MySQL里的Rand()生成 不连续重复 的随机数年龄以及随机姓名字符串

前言:        RAND函数,返回在范围0到1.0内的随机浮点值.如果一个整数参数N被指定,它被用作种子值. 一,朋友问题描述如下:(1),有一个用户表,有id,用户的真实名字,年龄.通过一段存储过程来实现向表里插入100数据,其中年龄随机姓名 姓氏:'赵钱孙李周吴郑王';,随机取出一个名字:'一段文字字符串',随机的取出一个字或者两个字要求:随机的名字不能出现连续重复. (2),然后我写出的代码如下:-- 创建用户表,在project里create table user1 (id int