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 20 MySQL
MySQL COUNT函数的使用与优化
May 10 MySQL
详细聊聊MySQL中慢SQL优化的方向
Aug 30 MySQL
MySQL8.0升级的踩坑历险记
Nov 01 MySQL
Linux系统下MySQL配置主从分离的步骤
Mar 21 MySQL
mysql使用instr达到in(字符串)的效果
Apr 03 MySQL
MySQL中EXPLAIN语句及用法
May 20 MySQL
MySQL普通表如何转换成分区表
May 30 MySQL
MySQL数据库表约束讲解
Jun 21 MySQL
MySQL外键约束(Foreign Key)案例详解
Jun 28 MySQL
前端传参数进行Mybatis调用mysql存储过程执行返回值详解
Aug 14 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 替换模板变量实现步骤
2009/08/24 PHP
PHP+SQL 注入攻击的技术实现以及预防办法
2011/01/27 PHP
PHP curl模拟浏览器采集阿里巴巴的实现代码
2011/04/20 PHP
简单实用的PHP防注入类实例
2014/12/05 PHP
PHP7正式版测试,性能惊艳!
2015/12/08 PHP
JavaScript Event事件学习第一章 Event介绍
2010/02/07 Javascript
基于jquery的实现简单的表格中增加或删除下一行
2010/08/01 Javascript
在浏览器窗口上添加遮罩层的方法
2012/11/12 Javascript
JavaScript操纵窗口的方法小结
2013/06/28 Javascript
基于jquery自定义的漂亮单选按钮RadioButton
2013/11/19 Javascript
JS图像无缝滚动脚本非常好用
2014/02/10 Javascript
jQuery DOM插入节点操作指南
2015/03/03 Javascript
JQUERY的AJAX请求缓存里的数据问题处理
2016/02/23 Javascript
遍历json 对象的属性并且动态添加属性的实现
2016/12/02 Javascript
js实现选项卡内容切换以及折叠和展开效果【推荐】
2017/01/08 Javascript
Nodejs中使用captchapng模块生成图片验证码
2017/05/18 NodeJs
详解使用nvm安装node.js
2017/07/18 Javascript
JavaScript实现随机数生成器(去重)
2017/10/13 Javascript
JavaScript Date对象应用实例分享
2017/10/30 Javascript
解决淘宝cnpm 安装后cnpm不是内部或外部命令的问题
2018/05/17 Javascript
Vue实现todolist删除功能
2018/06/26 Javascript
微信小程序自定义弹窗wcPop插件
2018/11/19 Javascript
详解@angular/cli 改变默认启动端口两种方式
2018/11/29 Javascript
node.js通过url读取文件
2020/10/16 Javascript
[05:15]DOTA2英雄梦之声_第16期_灰烬之灵
2014/06/21 DOTA
python获取图片颜色信息的方法
2015/03/18 Python
Python检测网站链接是否已存在
2016/04/07 Python
Python 性能优化技巧总结
2016/11/01 Python
利用Python循环(包括while&for)各种打印九九乘法表的实例
2017/11/06 Python
详解python数据结构和算法
2019/04/18 Python
Python实现语音识别和语音合成功能
2019/09/20 Python
留学推荐信写作指南
2014/01/25 职场文书
幼儿园大班见习报告
2014/10/31 职场文书
暑期社会实践新闻稿
2015/07/17 职场文书
教师反邪教心得体会
2016/01/15 职场文书
2016年学校党支部创先争优活动总结
2016/04/05 职场文书