思路:本题主要的问题就是如何求出每个岗位分数排名前2名的用户
- 首先我们先写出应该筛选的语句,并联立两个表
select g1.id, l.name, g1.score
from grade g1 join language l on g1.language_id = l.id
- 一般来说,一个表是求不出里面的数据的排名的,除非使用函数或者自连接去进行比较,这里我们使用自连接来解决
select count(distinct g2.score)
from grade g1, grade g2
where g2.score >= g1.score
and g1.language_id = g2.language_id
这里条件的
g2.score >= g1.score
是因为可能存在第1或者第2同分的情况,并列输出然后就是同岗位比较,所以要使用
g1.language_id = g2.language_id
count(distinct g2.score)
是去重之后的某一分数大于等于所有记录中score的个数。只有小于等于2,才能说明这个score排在了前两名。
- 然后就是排序条件
order by name,score DESC,a.id
- 联立SQL如下:
select g1.id, l.name, g1.score
from grade g1 join language l on g1.language_id=l.id
where
(
select count(distinct g2.score)
from grade g2
where g2.score>=g1.score and g1.language_id=g2.language_id
) <=2 order by l.name,g1.score desc ,g1.id;
参考大佬的文章:https://blog.nowcoder.net/n/6bb2432202b24444865c4e78a40a2086?f=comment