运行通过,解题思路如下:先筛选出最大的score记录和language_id信息,然后将最大记录排除,筛选出剩下记录中的最大记录(第二高的score)。
这样的话会遇到一种情况,如果只有一条记录的话,第二条记录是筛选不出来的。
所以在每次筛选出来后要做一次汇总,更新最大记录,如果筛选出记录,就将之前的记录(record)更新,否则,保持原先记录(record)不变,根据记录(record)来找出前两名的记录。
代码如下:
select g2.id,l.name,g2.score from grade g2,language l,
(
   select record.id as id,record.language_id as language_id ,if(ifnull(sub_record.score,0) =0,record.score,record.score*0+sub_record.score)as score from
     ( 
         select id, language_id, max(score)as score
         from grade gg
         group by gg.language_id
     ) as record
        left join
    (
        select id,language_id, max(score)as score 
        from grade g1 
        where (language_id,score)not in
        (
            select language_id, max(score) 
            from grade g
            group by g.language_id
        )
        group by g1.language_id
    )as sub_record 
    on record.language_id=sub_record.language_id
)as sub_max
where g2.language_id=l.id
and g2.score>=sub_max.score
and g2.language_id=sub_max.language_id
order by score desc