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 InnoDB存储引擎的内存管理
Apr 08 MySQL
MySQL之高可用集群部署及故障切换实现
Apr 22 MySQL
jdbc使用PreparedStatement批量插入数据的方法
Apr 27 MySQL
详解MySQL数据库千万级数据查询和存储
May 18 MySQL
详解mysql三值逻辑与NULL
May 19 MySQL
解决mysql问题:由于找不到MSVCR120.dll,无法继续执行代码
Jun 26 MySQL
MySQL8.0升级的踩坑历险记
Nov 01 MySQL
解决MySQL添加新用户-ERROR 1045 (28000)的问题
Mar 03 MySQL
实战 快速定位MySQL的慢SQL
Mar 22 MySQL
CentOS MySql8 远程连接实战
Apr 19 MySQL
sql查询语句之平均分、最高最低分及排序语句
May 30 MySQL
MySQL主从切换的超详细步骤
Jun 28 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利用COM对象访问SQLServer、Access
2006/10/09 PHP
PHP编程中字符串处理的5个技巧小结
2007/11/13 PHP
php 动态执行带有参数的类方法
2009/04/10 PHP
phpMyAdmin链接MySql错误 个人解决方案
2009/12/28 PHP
超小PHP小马小结(方便查找后门的朋友)
2012/05/05 PHP
php简单计算页面加载时间的方法
2015/06/19 PHP
PHP版本常用的排序算法汇总
2015/12/20 PHP
php+MySql实现登录系统与输出浏览者信息功能
2016/07/01 PHP
thinkPHP实现签到功能的方法
2017/03/15 PHP
thinkPHP5.0框架应用请求生命周期分析
2017/03/25 PHP
利用PHP_XLSXWriter代替PHPExcel的方法示例
2017/07/16 PHP
PHP5.5新特性之yield理解与用法实例分析
2019/01/11 PHP
php函数式编程简单示例
2019/08/08 PHP
取键盘键位ASCII码的网页
2007/07/30 Javascript
5款Javascript颜色选择器
2009/10/25 Javascript
js编码之encodeURIComponent使用介绍(asp,php)
2012/03/01 Javascript
jquery插件validate验证的小例子
2013/05/08 Javascript
JS实现添加,替换,删除节点元素的方法
2016/06/30 Javascript
项目实践一图片上传之form表单还是base64前端图片压缩(前端图片压缩)
2016/07/28 Javascript
微信小程序 loading 详解及实例代码
2016/11/09 Javascript
Agularjs妙用双向数据绑定实现手风琴效果
2017/05/26 Javascript
详解vue前后台数据交互vue-resource文档
2017/07/19 Javascript
深入理解React中何时使用箭头函数
2017/08/23 Javascript
详解微信小程序获取当前时间及日期的方法
2019/04/28 Javascript
解决vue+elementui项目打包后样式变化问题
2020/08/03 Javascript
[44:10]2018DOTA2亚洲邀请赛 4.5 淘汰赛 EG vs VP 第一场
2018/04/06 DOTA
python使用chardet判断字符串编码的方法
2015/03/13 Python
Python文件操作之合并文本文件内容示例代码
2017/09/19 Python
浅谈python实现Google翻译PDF,解决换行的问题
2018/11/28 Python
pycharm修改界面主题颜色的方法
2019/01/17 Python
python基于json文件实现的gearman任务自动重启代码实例
2019/08/13 Python
Python高级property属性用法实例分析
2019/11/19 Python
Python中的xlrd模块使用原理解析
2020/05/21 Python
Meli Melo官网:名媛们钟爱的英国奢侈手包品牌
2017/04/17 全球购物
2015年仓管员工作总结
2015/04/21 职场文书
python简单验证码识别的实现过程
2021/06/20 Python