mysql - 选择具有三个最大值的组

标签 mysql sql select group-by limit

考虑以下数据:

---+-----------+-------+--+
| 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 来过滤组,但没有成功。我不想设置过滤器等级>MAX(等级)-2,因为理论上我不会知道等级。但这个过滤器无论如何都不起作用。

我正在使用 MySQL。请帮忙!

最佳答案

您可以使用加入来执行此操作:

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 似乎拒绝这种语法。

关于mysql - 选择具有三个最大值的组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35772812/

相关文章:

php - 使用 php 连接到数据库对我不起作用。用户 'ahmadham_ahmad' 的访问被拒绝

MySQL - 获取发生事件的月份列表

sql - 将查询限制为一条记录会提高性能吗

php - 要从查询列表中删除的 Mysql 连接类型

mysql - 在sql查询中组合多行并连接表

sql - 获取每组的前 1 行

sql - 使用 Hibernate 进行不区分大小写的搜索

MySql select 显示按条件分组的总数

mysql - Cpanel MySQL 远程创建/删除数据库

MySQL 查询帮助,多个表