首先先写出应该筛选的语句,并且把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;