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 19 MySQL
MySQL单表千万级数据处理的思路分享
Jun 05 MySQL
mysql备份策略的实现(全量备份+增量备份)
Jul 07 MySQL
MySQL里面的子查询的基本使用
Aug 02 MySQL
mysql分表之后如何平滑上线详解
Nov 01 MySQL
MySQL创建定时任务
Jan 22 MySQL
详解MySql中InnoDB存储引擎中的各种锁
Feb 12 MySQL
Mysql如何实现不存在则插入,存在则更新
Mar 25 MySQL
MySQL 数据库范式化设计理论
Apr 22 MySQL
Mysql将字符串按照指定字符分割的正确方法
May 30 MySQL
MySQL控制流函数(-if ,elseif,else,case...when)
Jul 07 MySQL
MySQL表字段数量限制及行大小限制详情
Jul 23 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
Yii使用smsto短信接口的函数demo示例
2016/07/13 PHP
php cookie用户登录的详解及实例代码
2017/01/03 PHP
php图形jpgraph操作实例分析
2017/02/22 PHP
jquery 圆形旋转图片滚动切换效果
2011/01/19 Javascript
各浏览器中querySelector和querySelectorAll的实现差异分析
2012/05/23 Javascript
JavaScript 盒模型 尺寸深入理解
2012/12/31 Javascript
JQuery的AJAX实现文件下载的小例子
2013/05/15 Javascript
JavaScript使用DeviceOne开发实战(二) 生成调试安装包
2015/12/01 Javascript
BootStrap文件上传样式超好看【持续更新】
2016/05/10 Javascript
jquery动态切换背景图片的简单实现方法
2016/05/14 Javascript
Bootstrap表单Form全面解析
2016/06/13 Javascript
关于javascript中限定时间内防止按钮重复点击的思路详解
2016/08/16 Javascript
浅谈Javascript事件对象
2017/02/05 Javascript
微信小程序实现获取用户信息并存入数据库操作示例
2019/05/07 Javascript
JS跨浏览器解析XML应用过程详解
2020/10/16 Javascript
vue实现两个区域滚动条同步滚动
2020/12/13 Vue.js
[10:04]国际邀请赛采访专栏:DK.Farseer,mouz.Black^,采访员Josh专访
2013/08/05 DOTA
[04:47]DOTA2-潍坊风行电子俱乐部探秘
2014/08/08 DOTA
Python实现类继承实例
2014/07/04 Python
Python3读取zip文件信息的方法
2015/05/22 Python
python 输出所有大小写字母的方法
2019/01/02 Python
Python从list类型、range()序列简单认识类(class)【可迭代】
2019/05/31 Python
windows下安装Python虚拟环境virtualenvwrapper-win
2019/06/14 Python
Python制作微信好友背景墙教程(附完整代码)
2019/07/17 Python
Python3批量移动指定文件到指定文件夹方法示例
2019/09/02 Python
Python接口测试数据库封装实现原理
2020/05/09 Python
tensorflow 20:搭网络,导出模型,运行模型的实例
2020/05/26 Python
如何使用python记录室友的抖音在线时间
2020/06/29 Python
CSS3实现网站商品展示效果图
2020/01/18 HTML / CSS
客户代表自我评价范例
2013/09/24 职场文书
实践单位评语
2014/04/26 职场文书
区域销售主管岗位职责
2014/06/15 职场文书
2014年度安全工作总结
2014/12/04 职场文书
2015年酒店客房部工作总结
2015/04/25 职场文书
毕业欢送会致辞
2015/07/29 职场文书
幼儿园小班开学寄语(2016秋季)
2015/12/03 职场文书