mysql查询连续记录方式

mysql查询连续记录方式,第1张

mysql查询连续记录方式 目录
  • 案例
  • 解决思路
    • 1.对满足初次查询的数据赋予一个自增列b
    • 2.用自增的id减去自增列b
    • 3.对等差列c分组, 并将分组的id组装起来
    • 4.根据组装的id去找数据
  • 总结建议

    案例

    最近遇到一个业务需求, 需要查找满足条件且连续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;

    解决思路

    1.对满足初次查询的数据赋予一个自增列b
     select id,type,content,(@b:=@b+1) as b from cdb_labels a,(SELECT @b := 0) tmp_b where type=1;
    

    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;
    

    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;
    

    注:为了方便区分,这里查询分组成员要大于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 

    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的函数例如: GROUP_CONCAT() 的字符长度有限制(默认1024),如果连续记录较多会发生字符截取报错;
    • 建议可以分步骤去查询,防止嵌套子查询,还可以提升性能而且避免使用MySQL函数;

    以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。 

    欢迎分享,转载请注明来源:内存溢出

    原文地址: https://outofmemory.cn/sjk/2996850.html

    (0)
    打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
    上一篇 2022-09-26
    下一篇 2022-09-26

    发表评论

    登录后才能评论

    评论列表(0条)

    保存