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 27 MySQL
MySQL 表空间碎片的概念及相关问题解决
May 07 MySQL
简单了解 MySQL 中相关的锁
May 25 MySQL
详解MySQL中的pid与socket
Jun 15 MySQL
如何搭建 MySQL 高可用高性能集群
Jun 21 MySQL
MySQL的全局锁和表级锁的具体使用
Aug 23 MySQL
MySQL中的隐藏列的具体查看
Sep 04 MySQL
Mysql关于数据库是否应该使用外键约束详解说明
Oct 24 MySQL
MySQL学习之基础命令实操总结
Mar 19 MySQL
MySQL 数据表操作
May 04 MySQL
MySQL存储过程及语法详解
Aug 05 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给图片添加文字水印方法汇总
2015/08/27 PHP
php邮箱地址正则表达式验证
2015/11/13 PHP
简单谈谈PHP中的trait
2017/02/25 PHP
MAC下通过改apache配置文件切换php多版本的方法
2017/04/26 PHP
PHP实现的DES加密解密封装类完整实例
2017/04/29 PHP
javascript时间函数基础介绍
2013/03/28 Javascript
js单词形式的运算符
2014/05/06 Javascript
JS实现OCX控件的事件响应示例
2014/09/17 Javascript
jQuery 获取屏幕高度、宽度的简单实现案例
2016/05/17 Javascript
很棒的js Tab选项卡切换效果
2016/08/30 Javascript
为JQuery EasyUI 表单组件增加焦点切换功能的方法
2017/04/13 jQuery
jQuery EasyUI tree增加搜索功能的实现方法
2017/04/27 jQuery
详解使用Typescript开发node.js项目(简单的环境配置)
2017/10/09 Javascript
浅谈Vue初学之props的驼峰命名
2018/07/19 Javascript
Vue实现拖放排序功能的实例代码
2019/07/08 Javascript
jQuery pager.js 插件动态分页功能实例分析
2019/08/02 jQuery
layui扩展上传组件模拟进度条的方法
2019/09/23 Javascript
JS JQuery获取data-*属性值方法解析
2020/09/01 jQuery
针对Vue路由history模式下Nginx后台配置操作
2020/10/22 Javascript
python实现数通设备端口监控示例
2014/04/02 Python
Python实现简单状态框架的方法
2015/03/19 Python
Python Flask基础教程示例代码
2018/02/07 Python
python 读文件,然后转化为矩阵的实例
2018/04/23 Python
python 匹配url中是否存在IP地址的方法
2018/06/04 Python
python中的Elasticsearch操作汇总
2019/10/30 Python
pandas中read_csv、rolling、expanding用法详解
2020/04/21 Python
matplotlib bar()实现百分比堆积柱状图
2021/02/24 Python
澳大利亚购买太阳镜和眼镜网站:Glamoureyes
2020/09/22 全球购物
怎样比较两个类型为String的字符串
2016/08/17 面试题
程序员跳槽必看面试题总结
2013/06/28 面试题
给校长的一封检讨书
2014/09/20 职场文书
县人大领导班子四风对照检查材料思想汇报
2014/10/09 职场文书
英语邀请函范文
2015/02/02 职场文书
闪闪的红星观后感
2015/06/08 职场文书
SpringDataJPA实体类关系映射配置方式
2021/12/06 Java/Android
Spring Cloud OpenFeign模版化客户端
2022/06/25 Java/Android