首先先写出应该筛选的语句,并且把2个表联立起来:
select g1.id, l.name, g1.score
from grade g1 join language l on g1.language_id=l.id 
然后考虑应该怎么输出,一般来说,你无法获得一个表里面数据的排名,除非使用函数或者使用select 连接自己的表去比较,不懂的可以先去看一下 https://blog.nowcoder.net/n/07c24f0c8b7f4f058013f3707ef58f3b
这里考虑的不使用函数,使用select连接自己来解决,于是可以写出如下sql语句来获取当前分数在当前岗位的排名了:
select count(distinct g2.score) 
    from grade g2 
    where g2.score>=g1.score and g1.language_id=g2.language_id
这样要注意的是,第一,由于可能第1或者第2同分的情况,并列输出,所以要用
 g2.score>=g1.score
然后要是同岗位比较,所以要使用
g1.language_id=g2.language_id
不然比较的就是所有岗位的所有分数的排名了。
然后就是先按名字升序,按分数降序,按id降序,如下:
 order by l.name,g1.score desc ,g1.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;