您的位置:首页 > 博客中心 > 数据库 >

[MySQL] 分组排序取前N条记录以及生成自动数字序列,类似group by后 limit

时间:2022-03-13 23:38


前言:

        同事的业务场景是,按照cid、author分组,再按照id倒叙,取出前2条记录出来。

        oracle里面可以通过row_number() OVER (PARTITION BY cid,author ORDER BY id DESC) 表示根据cid,author分组,在分组内部根据id排序,而此函数计算的值就表示每组内部排序后的顺序编号(组内连续的唯一的),而mysql数据库就没有这样的统计函数,需要自己写复杂的sql来实现。


1,录入测试数据

  1. 2,原始的效率比较低下的子查询实现方式
    SQL代码如下:


    1. 只要将N换成你要的数字比如2,就表示查询出每个分组的前2条记录,如下所示:


      1. 3,使用动态sql来实现
        先构造序列号码,引入一个@row来做rownumber
        SET @row=0;SET @mid=‘‘;SELECT cid, author, @row:=@row+1 rownum FROM test ORDER BY  cid, author LIMIT 10;   

        序列号码已经出来了,再加一个@mid来进行分组,重点在于CASE WHEN @mid = author THEN @row:=@row+1 ELSE @row:=1 END rownum,表示分组的时候会自动从1计数指导这个分组数据遍历结束。
        SET @row=0;SET @mid=‘‘;SELECT cid, author,CASE WHEN @mid = author THEN @row:=@row+1 ELSE @row:=1 END rownum, @mid:=author FROM test ORDER BY cid,author DESC LIMIT 20;  

        好了,再外面加一层inner JOIN 再对 rownumber 做限制 就可以拿到目标数据了。
        SET @row=0;
        SET @mid=‘‘;
        SELECT a.*,b.rownum FROM test a 
        INNER JOIN (
        SELECT cid, author, id, CASE WHEN @mid = author THEN @row:=@row+1 ELSE @row:=1 END rownum, @mid:=author MID 
        FROM test 
        ORDER BY cid,author,id DESC
        ) b ON b.author=a.author AND b.cid=a.cid AND b.id=a.id  WHERE b.rownum<3;  


        执行结果如下所示:

        1. 参考文章地址:











热门排行

今日推荐

热门手游