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 06 MySQL
MySQL性能压力基准测试工具sysbench的使用简介
Apr 21 MySQL
MySQL 如何分析查询性能
May 12 MySQL
MySQL中你可能忽略的COLLATION实例详解
May 12 MySQL
mysql在项目中怎么选事务隔离级别
May 25 MySQL
Mysql基础知识点汇总
May 26 MySQL
mysql脏页是什么
Jul 26 MySQL
Centos7中MySQL数据库使用mysqldump进行每日自动备份的编写
Aug 02 MySQL
MySQL 用 limit 为什么会影响性能
Sep 15 MySQL
浅谈MySQL函数
Oct 05 MySQL
MySQL数据库中的锁、解锁以及删除事务
May 06 MySQL
MySQL控制流函数(-if ,elseif,else,case...when)
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
php xml文件操作实现代码(二)
2009/03/20 PHP
php 获取SWF动画截图示例代码
2014/02/10 PHP
PHP中子类重载父类的方法【parent::方法名】
2016/05/06 PHP
用jquery设置按钮的disabled属性的实现代码
2010/11/28 Javascript
Array栈方法和队列方法的特点说明
2014/01/24 Javascript
文本域光标操作的jQuery扩展分享
2014/03/10 Javascript
鼠标左键单击冲突的问题解决方法(防止冒泡)
2014/05/14 Javascript
谈谈我对JavaScript中typeof和instanceof的深入理解
2015/12/25 Javascript
解析javascript瀑布流原理实现图片滚动加载
2016/03/10 Javascript
JavaScript生成带有缩进的表格代码
2016/06/15 Javascript
JS仿百度自动下拉框模糊匹配提示
2016/07/25 Javascript
利用纯Vue.js构建Bootstrap组件
2016/11/03 Javascript
Jquery on绑定的事件 触发多次实例代码
2016/12/08 Javascript
快速实现JS图片懒加载(可视区域加载)示例代码
2017/01/04 Javascript
Vue.js路由vue-router使用方法详解
2017/03/20 Javascript
vue 国际化 vue-i18n 双语言 语言包
2018/06/07 Javascript
详解如何探测小程序返回到webview页面
2019/05/14 Javascript
Vue Router history模式的配置方法及其原理
2019/05/30 Javascript
layui 中select下拉change事件失效的解决方法
2019/09/20 Javascript
JavaScript 浏览器对象模型BOM原理与常见用法实例分析
2019/12/16 Javascript
javascript实现页面的实时时钟显示示例
2020/08/06 Javascript
用Eclipse写python程序
2018/02/10 Python
浅析python3字符串格式化format()函数的简单用法
2018/12/07 Python
pandas的相关系数与协方差实例
2019/12/27 Python
PyTorch实现ResNet50、ResNet101和ResNet152示例
2020/01/14 Python
办公室前台的岗位职责
2013/12/20 职场文书
写给女朋友的道歉信
2014/01/12 职场文书
党员批评与自我批评
2014/02/12 职场文书
应用数学专业求职信
2014/03/14 职场文书
关于环保的标语
2014/06/13 职场文书
无房产证房屋转让协议书合同样本
2014/10/18 职场文书
2014年乡镇个人工作总结
2014/12/03 职场文书
音乐之声观后感
2015/06/04 职场文书
消费者理赔投诉书
2015/07/02 职场文书
初中信息技术教学反思
2016/02/16 职场文书
解决Goland 同一个package中函数互相调用的问题
2021/05/06 Golang