mysql实现先排序再分组的方式

先排序再分组"与分组取前N条实则意思相同

创建一个表格 table
这里是一张成绩表,包含:姓名、班级、分数

idnameclassscore
1ac167
2bc155
3cc167
4dc165
5ec280
6fc265
7gc277
8hc273
9ic373
10jc368
11kc375
12lc381
13mc488
14nc490
15oc474
16pc477

需要展示结果:找出每个班级的前两名,并由高到低排序

idnameclassscore
1ac167
2bc167
3cc280
4dc277
5ec381
6fc375
7gc490
8hc488

方法一:

SELECT a.id,a.name,a.clsss,a.score FROM table a 
LEFT JOIN table b ON a.class=b.class AND a.score<b.score 
group by a.id,a.name,a.class,a.score 
having count(b.id)<2 
ORDER BY a.class,a.score desc

拆开分析:

LEFT JOIN table b ON a.class=b.class AND a.score<b.score

同一个班级(每个班级四个人),分数比当前学生高的记录,那就意味这成绩垫底的学生,将会产生三条记录

group by a.id,a.name,a.class,a.score having count(b.id)<2

a.id,a.name,a.class,a.score可以代表一个学生(以学生分组),如果count(b.id)<2(成绩超过你的人不能多于2个),那就只剩第一第二了。

方法二:

SELECT * FROM table a WHERE 
(SELECT COUNT(*) FROM table WHERE class=a.class and score>a.score) <2
ORDER BY a.class,a.score DESC;

取每一条记录,判断同一个班级,大于当前成绩的同学是不是小于2个人。

个人感觉,第二条比较好

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值