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 相关文章推荐
浅析InnoDB索引结构
Apr 05 MySQL
mysql字符串截取函数小结
Apr 05 MySQL
浅谈Mysql多表连接查询的执行细节
Apr 24 MySQL
Mysql效率优化定位较低sql的两种方式
May 26 MySQL
如何自己动手写SQL执行引擎
Jun 02 MySQL
MySQL query_cache_type 参数与使用详解
Jul 01 MySQL
MySQL Innodb索引机制详细介绍
Nov 23 MySQL
MySQL中B树索引和B+树索引的区别详解
Mar 03 MySQL
MySQL RC事务隔离的实现
Mar 31 MySQL
MySQL数据库查询进阶之多表查询详解
Apr 08 MySQL
MySQ InnoDB和MyISAM存储引擎介绍
Apr 26 MySQL
postgresql如何找到表中重复数据的行并删除
May 08 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
受疫情影响 动画《Re从零开始的异世界生活》第二季延期至7月
2020/03/10 日漫
IIS下配置Php+Mysql+zend的图文教程
2006/12/08 PHP
Joomla下利用configuration.php存储简单数据
2010/05/19 PHP
Windows下XDebug 手工配置与使用说明
2010/07/11 PHP
PHP下利用shell后台运行PHP脚本,并获取该脚本的Process ID的代码
2011/09/19 PHP
php中sql注入漏洞示例 sql注入漏洞修复
2014/01/24 PHP
php输出含有“#”字符串的方法
2017/01/18 PHP
PHP大文件分割上传 PHP分片上传
2017/08/28 PHP
Open and Print a Word Document
2007/06/15 Javascript
js实现弹窗插件功能实例代码分享
2013/12/12 Javascript
Node.js中安全调用系统命令的方法(避免注入安全漏洞)
2014/12/05 Javascript
自定义百度分享的分享按钮
2015/03/18 Javascript
javascript实现的闭包简单实例
2015/07/17 Javascript
JS实现根据文件字节数返回文件大小的方法
2016/08/02 Javascript
用nodejs的实现原理和搭建服务器(动态)
2016/08/10 NodeJs
JS常用正则表达式总结【经典】
2017/05/12 Javascript
javaScript封装的各种写法
2017/08/14 Javascript
vue.js中created方法作用
2018/03/30 Javascript
jQuery实现的响应鼠标移动方向插件用法示例【附源码下载】
2018/08/28 jQuery
vue3.0 CLI - 2.1 -  component 组件入门教程
2018/09/14 Javascript
pandas string转dataframe的方法
2018/04/11 Python
Python3.5基础之NumPy模块的使用图文与实例详解
2019/04/24 Python
python如何将多个PDF进行合并
2019/08/13 Python
Python中的四种交换数值的方法解析
2019/11/18 Python
基于Python实现扑克牌面试题
2019/12/11 Python
基于torch.where和布尔索引的速度比较
2020/01/02 Python
Python表达式的优先级详解
2020/02/18 Python
Python ConfigParser模块的使用示例
2020/10/12 Python
求职自荐信的格式
2014/04/07 职场文书
社区服务标语
2014/07/01 职场文书
就业协议书样本
2014/08/20 职场文书
行政专员岗位职责范本
2014/08/26 职场文书
大学生学习新党章思想汇报
2014/10/25 职场文书
幼儿园辞职信范文
2015/02/27 职场文书
python爬虫之爬取笔趣阁小说
2021/04/22 Python
CKAD认证中部署k8s并配置Calico插件
2022/03/31 Servers