mysql如何查询连续记录


Posted in MySQL onMay 11, 2022

案例

最近遇到一个业务需求, 需要查找满足条件且连续3出现条以上的记录。

表结构:

CREATE TABLE `cdb_labels` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `type` int(11) NOT NULL DEFAULT '0' COMMENT '标签类型:1喜欢异性类型,2擅长话题',
  `content` varchar(255) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL COMMENT '标签内容',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=57 DEFAULT CHARSET=utf8 COMMENT='标签内容';

所有数据:

SELECT * FROM cdb_labels WHERE type = 1;

mysql如何查询连续记录

解决思路

1.对满足初次查询的数据赋予一个自增列b

select id,type,content,(@b:=@b+1) as b from cdb_labels a,(SELECT @b := 0) tmp_b where type=1;

mysql如何查询连续记录

2.用自增的id减去自增列b

select id,type,content,( id-(@b:=@b+1) ) as c from cdb_labels a,(SELECT @b := 0) tmp_b where type=1;

mysql如何查询连续记录

3.对等差列c分组, 并将分组的id组装起来

select count(id),GROUP_CONCAT(id) from ( 
    select id,( id-(@b:=@b+1) ) as c from cdb_labels a,(SELECT @b := 0) tmp_b where type=1 
) as d GROUP BY c;

mysql如何查询连续记录

注:为了方便区分,这里查询分组成员要大于5(也就是连续出现超过5次的记录):

select if( count(id)>5 ,GROUP_CONCAT(id),null) e from ( 
    select id,( id-(@b:=@b+1) ) as c from cdb_labels a,(SELECT @b := 0) tmp_b where type=1 
) as d GROUP BY c;

那么得到的数据只有:9,10,11,12,13,14,15 

mysql如何查询连续记录

4.根据组装的id去找数据

select id,type,content from cdb_labels,(
    select if( count(id)>5 ,GROUP_CONCAT(id),null) e from ( 
        select id,( id-(@b:=@b+1) ) as c from cdb_labels a,(SELECT @b := 0) tmp_b where type=1 
    ) as d GROUP BY c
) as f where f.e is not null and FIND_IN_SET(id , f.e);

mysql如何查询连续记录

总结建议

  • MySQL的函数例如: GROUP_CONCAT() 的字符长度有限制(默认1024),如果连续记录较多会发生字符截取报错;
  • 建议可以分步骤去查询,防止嵌套子查询,还可以提升性能而且避免使用MySQL函数;
MySQL 相关文章推荐
一篇文章弄懂MySQL查询语句的执行过程
May 07 MySQL
详解MySQL 联合查询优化机制
May 10 MySQL
详解MySQL数据库千万级数据查询和存储
May 18 MySQL
MySql存储过程之逻辑判断和条件控制
May 26 MySQL
MYSQL(电话号码,身份证)数据脱敏的实现
May 28 MySQL
mysql 如何获取两个集合的交集/差集/并集
Jun 08 MySQL
MySQL系列之十五 MySQL常用配置和性能压力测试
Jul 02 MySQL
MySQL Shell import_table数据导入的实现
Aug 07 MySQL
MySQL窗口函数的具体使用
Nov 17 MySQL
Mysql调整优化之四种分区方式以及组合分区
Apr 13 MySQL
mysql数据库隔离级别详解
Jun 16 MySQL
mysql查看表结构的三种方法总结
Jul 07 MySQL
mysql 体系结构和存储引擎介绍
MySQL数据库 安全管理
May 06 #MySQL
Mysql 文件配置解析介绍
May 06 #MySQL
MySQL数据库中的锁、解锁以及删除事务
May 06 #MySQL
mysql性能优化以及配置连接参数设置
May 06 #MySQL
Mysql InnoDB 的内存逻辑架构
详细介绍MySQL中limit和offset的用法
May 06 #MySQL
You might like
php4的彩蛋
2006/10/09 PHP
javascript 中String.match()与RegExp.exec()的区别说明
2013/01/10 Javascript
jquery实现侧边弹出的垂直导航
2014/12/09 Javascript
jQuery中width()方法用法实例
2014/12/24 Javascript
jQuery DataTables插件自定义Ajax分页实例解析
2020/04/28 Javascript
jQuery验证插件validate使用方法详解
2020/09/13 Javascript
javascript轮播图算法
2016/10/21 Javascript
jQuery中值得注意的trigger方法浅析
2016/12/12 Javascript
mint-ui 时间插件使用及获取选择值的方法
2018/02/09 Javascript
JavaScript同源策略和跨域访问实例详解
2018/04/03 Javascript
Vuejs学习笔记之使用指令v-model完成表单的数据双向绑定
2019/04/29 Javascript
d3.js 地铁轨道交通项目实战
2019/11/27 Javascript
JavaScript实现左右滚动电影画布
2020/02/06 Javascript
[02:51]DOTA2英雄基础教程 风暴之灵
2013/12/23 DOTA
python使用三角迭代计算圆周率PI的方法
2015/03/20 Python
在Python中用has_key()方法查找键是否存在的教程
2015/05/21 Python
json跨域调用python的方法详解
2017/01/11 Python
基于tensorflow加载部分层的方法
2018/07/26 Python
Python2和Python3的共存和切换使用
2019/04/12 Python
python使用opencv对图像mask处理的方法
2019/07/05 Python
python中Django文件上传方法详解
2020/08/05 Python
Python之qq自动发消息的示例代码
2021/02/18 Python
美国专注于健康商品的网站:eVitamins
2017/01/23 全球购物
Beauty Expert美国/加拿大:购买奢侈美容产品
2018/12/05 全球购物
全球最大的生存食品、水和装备专用在线市场:BePrepared.com
2020/01/02 全球购物
《果园机器人》教学反思
2014/04/13 职场文书
横幅标语大全
2014/06/17 职场文书
我们的节日国庆活动方案
2014/08/19 职场文书
机关干部三严三实心得体会
2014/10/13 职场文书
2014年学生会工作总结
2014/11/07 职场文书
2014年加油站站长工作总结
2014/12/23 职场文书
护士求职自荐信范文
2015/03/04 职场文书
4S店收银员岗位职责
2015/04/07 职场文书
婚庆公司开业主持词
2015/06/30 职场文书
Python如何解决secure_filename对中文不支持问题
2021/07/16 Python
Mysql 数据库中的 redo log 和 binlog 写入策略
2022/04/26 MySQL