MYSQL取分组后的前几条记录

环境:mysql 5.7
数据库中有一个报餐表,我要取各个用餐地址组内用餐最多的前三名数据
表中部分数据是这样的
MYSQL取分组后的前几条记录_第1张图片
第一种方法:

select lounum,fdcount from fr_foods填报 a
where 3>(select count(*) from fr_foods填报 b where lounum=a.lounum and fdcount>a.fdcount )order by a.lounum,a.fdcount desc

结果:
MYSQL取分组后的前几条记录_第2张图片
这个会把组内所有跟前三名并列的都查出来
速度:✿

第二种方法:

select  * from (
select a.*,case when lounum=@lounum then @r:=@r+1 else @r:=1 end as r,@lounum:=lounum from(select lounum,fdcount from  `fr_foods填报` order by lounum,fdcount desc)a,(select @lounum='',@r=0)tmp) q
where r<=3

这种方法就是代替mysql 8.0 的row_number() over()窗口函数的方法,因为mysql5.7没有row_number()函数
结果:
MYSQL取分组后的前几条记录_第3张图片
这个方法就是只取组内的前三条,不管后面还有没有相同的
速度:✿✿✿✿✿
第三种方法:

select  * from (
select a.*,@r:=case when lounum!=@lounum  then 1 when @fdcount=fdcount then @r else @r:=@r+1 end as r,@lounum:=lounum,@fdcount:=fdcount from(select lounum,fdcount from  `fr_foods填报` order by lounum,fdcount desc)a,(select @lounum='',@r=0,@fdcount=0)tmp) q
where r<=3

这种方法就是代替mysql 8.0 的dense_rank() over()窗口函数的方法,因为mysql5.7没有dense_rank() 函数
结果:
MYSQL取分组后的前几条记录_第4张图片
把前三名并列的都查询出来
速度:✿✿✿✿✿

第四种方法:(这种环境是mysql 8.0及以上版本的)

select * from (
select lounum,fdcount,row_number() over(partition by lounum order by fdcount desc) as a  from `fr_foods填报`) r where a<=3

结果:
MYSQL取分组后的前几条记录_第5张图片
跟方法二的逻辑是一样的,但是可以按照业务场景需求来选择使用rank() ,dense_rank(),row_number()来查询,他们的区别可以参考 MySQL中rank()、row_number()、dense_rank()排序
速度:✿✿✿✿✿

你可能感兴趣的:(MYSQL从入门到放弃,mysql)