获取各类前几名数据的MYSQL写法

前几天,某在培训的朋友问我一个问题:查询每门功课成绩最好的前两名该怎么写。

这个问题虽然听起来挺简单,但是很有意思,于是我就新建了一张如下的表:

stuNo为学号,stuScore为分数,courseId为课程id。

然后我的思路是把每科分数最高的两个学生筛选出来,然后再进行处理,但是MySQL子查询不能包含LIMIT字段,而且这样写有点蠢,所以查了查资料找出了一种比较好的写法,如下:

 1 select a1.* from score a1
 2 INNER JOIN
 3 (select a.courseId,a.stuScore from score a left join score b
 4 on a.courseId=b.courseId 
 5 and a.stuScore<=b.stuScore
 6 group by a.courseId,a.stuScore
 7 having count(b.stuScore)<=2
 8 )b1
 9 on a1.courseId=b1.courseId and a1.stuScore=b1.stuScore
10 order by a1.courseId,a1.stuScore desc;

虽然这样写有点繁琐,但是这种写法是对的,我自己也没找到更好的写法,就把答案给了朋友。

然后,第二天,朋友说他们老师的答案是:

1 Select * from score a
2 where (Select count(*) from score b
3 where a.courseId=b.courseId 
4 and a.stuScore<=b.stuScore 
5 )<=2
6 order by courseId,stuScore desc;

当时看到答案,我心里:卧槽!!!这是什么写法,为什么where条件判断了一下select count(*)是否小于等于2就能做到筛选各科数据前几名 ???

然后,我自己网上找了一下select count(*)写法相关的资料,没找到任何答案。。。

然后,我问我们领队,他找了半天,也没找到任何答案。。。

然后,我们领队问我们项目经理,也没答案。。。

然后,就没然后了。。。

目前我还在等朋友老师的答案,所以暂时写到这儿吧。。。虽然不太理解这种写法,但是这种写法无疑做到了筛选的功能,而且异常简洁,所以在这里记录一下这种写法。如果大家有理解这种写法的请赐教,在评论区留言,解除菜鸟的疑惑。

 

posted @ 2017-12-26 10:12  Ericzya  阅读(1460)  评论(1编辑  收藏  举报