2017-12-24 4 views
2
Name Marks 
------------- 
John 100 
John 80 
John 70 
John 60 
Nancy 95 
Nancy 88 
Nancy 70 
Nancy 40 

私は上記の表を持っています。私は各候補者の中で3番目に高い評価を得たいと思っています。私の出力は、私が候補者ごとにn番目の最高点(異なるデータ)を取得するクエリを柔軟にしたい。一般にmysqlによるグループでn番目にベスト

Name Marks 
------------- 
John 70 
Nancy 70 

でなければなりません。 私はmysqlでn番目に高いデータを取得することを知っていますが、order by desc limit n-1,nを実行できますが、各グループに対してどのように行うのですか。

答えて

1

select t1.* 
from your_table t1 
join 
(
    select name, 
      @rank := case when @prevName = name then @rank + 1 else 1 end as rank, 
      @prevName := name 
    from your_table 
    cross join (select @rank := 0, @prevName := '') tmp 
    group by name 
    order by name asc, marks desc 
) t2 on t1.name = t2.name 
where t2.rank = 3 
3

別のものを試してみてくださいは、変数を使用せずに、句を持つ中3は第三最高のマークを表しています。

SELECT a.name, 
     a.mark 
FROM  your_table a left join your_table b on 
     a.mark<b.mark and a.name=b.name 
GROUP BY a.name, a.mark 
HAVING (count(b.mark)+1=3) 
関連する問題