核心思路: 将当前表分数跟一个临时表进行比较,当临时表没有一个分数,或者只有一个分数比当前表高时,说明该分数排名是第一名,或者第二名。
举例:只看C++语言,id为1时,12000<13000,说明这是第二名,id为2时,13000统计出来为0个,没人比他小,说明他是第一名,id为6时,可以知道11000小于12000和13000,为2,说明是第三名。
避坑点:一定要去重!不然在java语言的时候,10000小于两个12000,就是第三名了,然而题目要求可以并列,为第二名

select g.id,l.name,g.score
from grade g,language l
where g.language_id=l.id and
(select count(distinct g1.score) from grade g1 where g.language_id=g1.language_id and g.score<g1.score) in (0,1)
order by l.name ASC,g.score DESC,g.id ASC