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部分操作
Apr 05 MySQL
Mysql Show Profile
Apr 05 MySQL
MySQL主从复制断开的常用修复方法
Apr 07 MySQL
详解MySQL连接挂死的原因
May 18 MySQL
MySQL 8.0 之不可见列的基本操作
May 20 MySQL
Mysql 设置boolean类型的操作
Jun 04 MySQL
MySQL 十大常用字符串函数详解
Jun 30 MySQL
Mysql中有关Datetime和Timestamp的使用总结
Dec 06 MySQL
MySQL优化常用的19种有效方法(推荐!)
Mar 17 MySQL
mysql中如何用命令创建联合唯一索引
Apr 20 MySQL
MySQL中EXPLAIN语句及用法
May 20 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
来自phpguru得Php Cache类源码
2010/04/15 PHP
PHP最常用的2种设计模式工厂模式和单例模式介绍
2012/08/14 PHP
php清空(删除)指定目录下的文件,不删除目录文件夹的实现代码
2014/09/04 PHP
thinkPHP多域名情况下使用memcache方式共享session数据的实现方法
2016/07/21 PHP
php计数排序算法的实现代码(附四个实例代码)
2020/03/31 PHP
javascript 函数调用的对象和方法
2010/07/01 Javascript
javascript自动改变文字大小和颜色的效果的小例子
2013/08/02 Javascript
最短的IE判断var ie=!-[1,]分析
2014/05/28 Javascript
2种jQuery 实现刮刮卡效果
2015/02/01 Javascript
js限制文本框只能输入中文的方法
2015/08/11 Javascript
JavaScript微信定位功能实现方法
2016/11/29 Javascript
全面总结Javascript对数组对象的各种操作
2017/01/22 Javascript
JS实现的简单标签点击切换功能示例
2017/09/21 Javascript
深入掌握 react的 setState的工作机制
2017/09/27 Javascript
详解http访问解析流程原理
2017/10/18 Javascript
bootstrap中selectpicker下拉框使用方法实例
2018/03/22 Javascript
微信小程序云开发之数据库操作
2019/05/18 Javascript
Vue发布项目实例讲解
2019/07/17 Javascript
使用httplib模块来制作Python下HTTP客户端的方法
2015/06/19 Python
python事件驱动event实现详解
2018/11/21 Python
如何在Django中添加没有微秒的 DateTimeField 属性详解
2019/01/30 Python
python GUI库图形界面开发之PyQt5动态加载QSS样式文件
2020/02/25 Python
Python3开发实例之非关系型图数据库Neo4j安装方法及Python3连接操作Neo4j方法实例
2020/03/18 Python
Python如何输出整数
2020/06/07 Python
详解Pandas 处理缺失值指令大全
2020/07/30 Python
Python 2.6.6升级到Python2.7.15的详细步骤
2020/12/14 Python
css 元素选择器的简单实例
2016/05/23 HTML / CSS
拉斯维加斯城市观光通行证:Las Vegas Pass
2019/05/21 全球购物
软件测试企业面试试卷
2016/07/13 面试题
servlet面试题
2012/08/20 面试题
干部鉴定材料
2014/05/18 职场文书
医学专业自荐信
2014/06/14 职场文书
创先争优承诺书
2015/01/20 职场文书
Android开发 使用文件储存的方式保存QQ密码
2022/04/24 Java/Android
Python使用Beautiful Soup(BS4)库解析HTML和XML
2022/06/05 Python
在ubuntu下安装go开发环境的全过程
2022/08/05 Golang