与mysql组合最好

时间:2017-12-24 21:40:18

标签: mysql

Name    Marks
-------------
John    100
John    80
John    70
John    60
Nancy   95
Nancy   88
Nancy   70
Nancy   40

我有上表。我想获得每位候选人的第三高分。我的输出应该是

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

一般情况下,我想使查询灵活,以获得每个候选人(不同数据)的第n个最高分。 我知道在mysql中,要获得第n个最高数据,我可以order by desc limit n-1,n,但我该如何为每个组执行此操作。

2 个答案:

答案 0 :(得分:2)

另一个,没有变量,3 in having子句代表第三高分。

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)

答案 1 :(得分: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