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 05 MySQL
MYSQL(电话号码,身份证)数据脱敏的实现
May 28 MySQL
MySQL中存储时间的最佳实践指南
Jul 01 MySQL
MySQL如何解决幻读问题
Aug 07 MySQL
mysql创建存储过程及函数详解
Dec 04 MySQL
MySQL Server层四个日志的实现
Mar 31 MySQL
排查MySQL生产环境索引没有效果
Apr 11 MySQL
Mysql排查分析慢sql之explain实战案例
Apr 19 MySQL
MYSQL常用函数介绍
May 05 MySQL
MySQL GTID复制的具体使用
May 20 MySQL
MySQL中EXPLAIN语句及用法
May 20 MySQL
MySQL实现字段分割一行转多行的示例代码
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静态变量当缓存的方法
2013/11/13 PHP
php获取网页里所有图片并存入数组的方法
2015/04/06 PHP
PHP对象的浅复制与深复制的实例详解
2017/10/26 PHP
PHP随机数函数rand()与mt_rand()的讲解
2019/03/25 PHP
TP5框架实现签到功能的方法分析
2020/04/05 PHP
ExtJS GTGrid 简单用户管理
2009/07/01 Javascript
js 未结束的字符串常量错误解决方法
2010/06/13 Javascript
10条建议帮助你创建更好的jQuery插件
2015/05/18 Javascript
jquery实现用户打分评分特效
2015/05/28 Javascript
JavaScript事件类型中UI事件详解
2016/01/14 Javascript
学习JavaScript事件流和事件处理程序
2016/01/25 Javascript
ECMAScript6轮播图实践知识总结
2016/08/17 Javascript
详解vue的数据binding绑定原理
2017/04/12 Javascript
vue组件如何被其他项目引用
2017/04/13 Javascript
推荐三款不错的图片压缩上传插件(webuploader、localResizeIMG4、LUploader)
2017/04/21 Javascript
JavaScript无操作后屏保功能的实现方法
2017/07/04 Javascript
详解利用Angular实现多团队模块化SPA开发框架
2017/11/27 Javascript
layui点击按钮页面会自动刷新的解决方案
2019/10/25 Javascript
Python Trie树实现字典排序
2014/03/28 Python
python3+PyQt5实现文档打印功能
2018/04/24 Python
tensorflow使用神经网络实现mnist分类
2018/09/08 Python
python random从集合中随机选择元素的方法
2019/01/23 Python
TensorFlow索引与切片的实现方法
2019/11/20 Python
Python实现病毒仿真器的方法示例(附demo)
2020/02/19 Python
深入浅析css3 border-image边框图像详解
2015/11/24 HTML / CSS
AmazeUI 缩略图的实现示例
2020/08/18 HTML / CSS
AmazeUI在模态框中嵌入表单形成模态输入框
2020/08/20 HTML / CSS
整个世界的设计师家具在哈恩:Designathome
2019/03/25 全球购物
Genny意大利官网:意大利高级时装品牌
2020/04/15 全球购物
大二自我鉴定
2014/01/31 职场文书
慰问敬老院活动总结
2014/04/26 职场文书
小摄影师教学反思
2014/04/27 职场文书
2015年十一国庆节演讲稿
2015/03/20 职场文书
公司管理制度范本
2015/08/03 职场文书
2016年社区“我们的节日·中秋节”活动总结
2016/04/05 职场文书
关于Mybatis中SQL节点的深入解析
2022/03/19 Java/Android