Select 个具有三个最大值的组

Select groups with the three biggest values

考虑以下数据:

---+-----------+-------+--+
| id |   name    | grade |  |
+----+-----------+-------+--+
| 13 | Maria     |    10 |  |
| 18 | Lorenzo   |    10 |  |
|  2 | Cissa     |    10 |  |
|  3 | Neto      |     9 |  |
| 15 | Gabriel   |     9 |  |
| 10 | Laura     |     9 |  |
| 12 | Joãozinho |     8 |  |
| 16 | Sergio    |     8 |  |
|  8 | Adriele   |     8 |  |
|  6 | Jorgito   |     8 |  |
|  5 | Aline     |     8 |  |
|  1 | Cintia    |     8 |  |
| 19 | Fabiana   |     7 |  |
| 11 | Vinicius  |     7 |  |
|  9 | Tatiane   |     7 |  |
|  7 | Chico     |     7 |  |
|  4 | Marcos    |     7 |  |
| 14 | Pedro     |     6 |  |
| 17 | Mauricio  |     6 |  |
| 20 | Leonardo  |     6 |  |
+----+-----------+-------+--+

我需要成绩前三名的同学。我想我需要按年级对数据进行分组,并限制在前 3 组。

"SELECT * FROM student GROUP BY grade LIMIT 3" 只给我 3 行,这不是我想要的。

我试过使用 HAVING 来过滤组,但没有成功。我不想设置filter grade>MAX(grade)-2,因为理论上我不会知道等级。但是这个过滤器无论如何都不起作用。

我正在使用 MySQL。请帮忙!

您可以使用 join:

select s.*
from student s join
     (select grade
      from student
      group by grade
      order by grade desc
      limit 3
     ) g3
     on s.grade = g3.grade;

在大多数数据库中,您可以使用 in:

select s.*
from student s
where s.grade in (select grade
                  from student
                  group by grade
                  order by grade desc
                  limit 3
                 );

然而,MySQL 似乎拒绝这种语法。

select s1.*
from students s1
  join (select distinct grade from students 
        order by grade desc limit 3) s2 on s1.grade = s2.grade

或者:

select *
from students 
where grade >= (select distinct grade from students 
                order by grade desc limit 2,1)

select秒* 来自学生的加入 (select 前三名 来自学生 按年级分组 按年级排序
) g3 在 s.grade = g3.grade;