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慢查询的坑
Apr 28 MySQL
Mysql Online DDL的使用详解
May 20 MySQL
虚拟机linux端mysql数据库无法远程访问的解决办法
May 26 MySQL
SQL实现LeetCode(176.第二高薪水)
Aug 04 MySQL
SpringBoot连接MySQL获取数据写后端接口的操作方法
Nov 02 MySQL
一文了解MySQL二级索引的查询过程
Feb 24 MySQL
Nebula Graph解决风控业务实践
Mar 31 MySQL
Mysql超详细讲解死锁问题的理解
Apr 01 MySQL
MySQL GTID复制的具体使用
May 20 MySQL
MySQL优化之慢日志查询
Jun 10 MySQL
MySQL 原理优化之Group By的优化技巧
Aug 14 MySQL
mysql数据库如何转移到oracle
Dec 24 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
PHP中的integer类型使用分析
2010/07/27 PHP
php中检查文件或目录是否存在的代码小结
2012/10/22 PHP
PHP实现获取url地址中顶级域名的方法示例
2019/06/05 PHP
Laravel 实现Controller向blade前台模板赋值的四种方式小结
2019/10/22 PHP
javascript 动态添加表格行
2006/06/22 Javascript
jquery.pagination.js 无刷新分页实现步骤分享
2012/05/23 Javascript
jQuery :first选择器使用介绍
2013/08/09 Javascript
jquery ajax应用中iframe自适应高度问题解决方法
2014/04/12 Javascript
javascript 回调函数详解
2014/11/11 Javascript
使用EVAL处理jqchart jquery 折线图返回数据无效的解决办法
2015/11/26 Javascript
javascript实现html页面之间参数传递的四种方法实例分析
2015/12/15 Javascript
Bootstrap实现input控件失去焦点时验证
2016/08/04 Javascript
jQuery动态添加与删除tr行实例代码
2016/10/18 Javascript
AngularJS前端页面操作之用户修改密码功能示例
2017/03/27 Javascript
详解angularjs获取元素以及angular.element()用法
2017/07/25 Javascript
微信小程序注册60s倒计时功能 使用JS实现注册60s倒计时功能
2017/08/16 Javascript
JavaScript生成指定范围的时间列表
2018/03/19 Javascript
JavaScript数组,JSON对象实现动态添加、修改、删除功能示例
2018/05/26 Javascript
AngularJS 多指令Scope问题的解决
2018/10/25 Javascript
基于javascript的拖拽类封装详解
2019/04/19 Javascript
ES6 Class中实现私有属性的一些方法总结
2019/07/08 Javascript
JavaScript实现简单日历效果
2020/09/11 Javascript
python中利用await关键字如何等待Future对象完成详解
2017/09/07 Python
Python字符串内置函数功能与用法总结
2019/04/16 Python
python 监测内存和cpu的使用率实例
2019/11/28 Python
logging level级别介绍
2020/02/21 Python
利用HTML5中的Canvas绘制一张笑脸的教程
2015/05/07 HTML / CSS
Canvas制作旋转的太极的示例
2018/03/09 HTML / CSS
美国电子产品购物网站:BuyDig.com
2020/06/17 全球购物
一份比较全的PHP面试题
2016/07/29 面试题
大型车展策划方案
2014/02/01 职场文书
禁毒宣传工作方案
2014/05/23 职场文书
班子个人四风问题整改措施
2014/10/04 职场文书
入党自荐书范文
2015/03/05 职场文书
《家庭教育》读后感3篇
2019/12/18 职场文书
HTML常用标签超详细整理
2022/03/19 HTML / CSS