mysql groupby 组内排序,获取top n

看了很多思路,有的是内联比较,有的是count比较,还有的转换思路只用order,我看着比较简介的就是转换思路用临时列和order 分组排序

先贴sql

##设置两个临时列来排序
set @row_num = 0;
set @field_value= '';

select e.id,
       e.field1,
       w.number
from table as e
         join
     (select id,
             (case
                  when @field_value = field1
                      then @row_num := @row_num + 1
                  else @row_num := 1
                 end) as number,
           ##重新赋值
          @field_value:= field1
      from table
      order by field1 desc) as w
     on e.id = w.id
##看你条件
where w.number =1;

结果:

数据:

 

思路:

按照字段field1分组之后获取top n ,也就是按照字段field1分组之后组内order by field2 asc/desc limit n,但是mysql 没有这种写法;

那么我们换个思路,分组实际上是不是相当于, order by field1,field2 asc/desc,那接下来如何实现组内的limit呢?如果有一个排序字段number在每个分组内是独立的,类似于threadlocal,那么我们是不是可以通过这个字段number的次序来进行选取。

分析sql:

主要点就在于 先按照field1排序,这样你得到的数据就是相同的field1在一起,当你循环查询的时候,我们结合上面的数据来看 测试5是第一条数据,此时你的临时变量@field_value 是'',那么执行case之后你的临时变量@row_num,就是1,得到了数据测试5,1;同理得到测试4,3,2的数据,当你最后到测试1的时候,得到第一条数据是测试1,1;接着,你的 临时变量@field_value值就变成了测试1,这时候又来了一条测试1,那么case之后你的临时变量@row_num就+1得到2,所以就实现了分组排序。

select id,
             (case
                  when @field_value = field1
                      then @row_num := @row_num + 1
                  else @row_num := 1
                 end) as number,
           ##重新赋值
          @field_value:= field1
      from table
      order by field1 desc

同理其他分组情况也可以实现

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值