mysql中TopN的实现

实现原理:

要实现TopN,必定需要将数据进行分组,再将每个分组里边的数据进行排序。其实这个用order by a,b 就能够对a字段进行分组,再对b进行排序。排完序之后只需要将前N个就可以了。在这里插入图片描述
就像这样,我们只需要把他们进行排序即可,我们可以创建两个字段,第一个字段记录上一个subject,第二个字段用来标记当前行subject是否为上一个subject,如果是就自加,不是就赋值为1
select a.*,
@rankid := if(@subj = subject,@rankid + 1, 1) rankid,
@subj := a.subject subj 
from chengji a,
(select @subj = '',@rankid = 0) r 
order by subject,score desc;

在这里插入图片描述

标记好值之后,取出rank_id < N就可以了
select aa.stuname,aa.subject,aa.score,aa.rankid paiming from 
(select a.*,
@rankid := if(@subj = subject,@rankid + 1, 1) rankid,
@subj := a.subject subj 
from chengji a,
(select @subj = '',@rankid = 0) r 
order by subject,score desc) aa 
where aa.rankid <= 2 
order by aa.subject,aa.score desc;

在这里插入图片描述

需要注意的是 rank_Id的赋值需要放在前面,如果放在后边,前边@subj 表示的是当前行的数据了。
扩展:
对于排名也有相同分数的情况,这种情况需要再来一个辅助参数用来记录分数是否一样,如果一样就还是这个值,但是如果需要记录排名的话可能需要再添加一个参数用来记录正常排名。
select aa.stuname,aa.subject,aa.score,aa.tmprank paiming from 
(select a.*,
@rankid := if(@subj = subject,@rankid + 1, 1) rankid,
@tmprank := if(@subj = subject and @score = a.score,@tmprank,@rankid) tmprank,
@subj := a.subject subj ,
@score := a.score scor
from chengji a,
(select @subj = '',@rankid = 0,@score = 0,@tmprank = 0) r 
order by subject,score desc) aa 
order by aa.subject,aa.score desc;

在这里插入图片描述

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值