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 update set 和 and的区别
May 08 MySQL
为什么MySQL选择Repeatable Read作为默认隔离级别
Jul 26 MySQL
SQL实现LeetCode(196.删除重复邮箱)
Aug 07 MySQL
MySQL的全局锁和表级锁的具体使用
Aug 23 MySQL
一次MySQL启动导致的事故实战记录
Sep 15 MySQL
SQL 聚合、分组和排序
Nov 11 MySQL
MySQL中CURRENT_TIMESTAMP的使用方式
Nov 27 MySQL
MySQL学习必备条件查询数据
Mar 25 MySQL
分析MySQL优化 index merge 后引起的死锁
Apr 19 MySQL
MySQL的存储过程和相关函数
Apr 26 MySQL
MySQL 逻辑备份 into outfile
May 15 MySQL
MySQL事务的ACID特性以及并发问题方案
Jul 15 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
WINDOWS 2000下使用ISAPI方式安装PHP
2006/09/05 PHP
php利用新浪接口查询ip获取地理位置示例
2014/01/20 PHP
PHP整合PayPal支付
2015/06/11 PHP
深入浅析php json 格式控制
2015/12/24 PHP
thinkphp 中的volist标签在ajax操作中的特殊性(推荐)
2018/01/15 PHP
php+js实现的无刷新下载文件功能示例
2019/08/23 PHP
javascript 短路法代码精简
2009/08/20 Javascript
一个原生的用户等级的进度条
2010/07/03 Javascript
jQuery初学:find()方法及children方法的区别分析
2011/01/31 Javascript
jQuery控制输入框只能输入数值的小例子
2013/03/20 Javascript
javascript中打印当前的时间实现思路及代码
2013/12/18 Javascript
jQuery带时间的日期控件代码分享
2015/08/26 Javascript
js智能获取浏览器版本UA信息的方法
2016/08/08 Javascript
js中删除数组中的某一元素实例(无下标时)
2017/02/28 Javascript
简单实现AngularJS轮播图效果
2020/04/10 Javascript
iscroll实现下拉刷新功能
2017/07/18 Javascript
让axios发送表单请求形式的键值对post数据的实例
2018/08/11 Javascript
17道题让你彻底理解JS中的类型转换
2019/08/08 Javascript
Vue实现多标签选择器
2019/11/28 Javascript
零基础写python爬虫之使用urllib2组件抓取网页内容
2014/11/04 Python
Django中对数据查询结果进行排序的方法
2015/07/17 Python
Python实现的多线程同步与互斥锁功能示例
2017/11/30 Python
用Python实现二叉树、二叉树非递归遍历及绘制的例子
2019/08/09 Python
Python二元赋值实用技巧解析
2019/10/25 Python
Python读取JSON数据操作实例解析
2020/05/18 Python
详解python logging日志传输
2020/07/01 Python
医学毕业生自荐信
2013/10/11 职场文书
工作时间上网检讨书
2014/02/03 职场文书
个人现实表现材料
2014/02/04 职场文书
涪陵白鹤梁导游词
2015/02/09 职场文书
我们的节日重阳节活动总结
2015/03/24 职场文书
2015年员工工作表现评语
2015/03/25 职场文书
食品药品安全责任书
2015/05/11 职场文书
慰问信(范文3篇)
2019/10/23 职场文书
Sql-Server数据库单表查询 4.3实验课
2021/04/05 SQL Server
关于antd tree 和父子组件之间的传值问题(react 总结)
2021/06/02 Javascript