看了很多思路,有的是内联比较,有的是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
同理其他分组情况也可以实现