【问题标题】:Select groups with the three biggest values选择具有三个最大值的组
【发布时间】:2016-03-03 12:57:44
【问题描述】:

考虑这些数据:

---+-----------+-------+--+
| 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。请帮忙!

【问题讨论】:

  • 预期结果是什么? (使用指定的样本数据。)
  • 所有10、9、8年级的学生。

标签: mysql sql select group-by limit


【解决方案1】:

您可以使用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 似乎拒绝这种语法。

【讨论】:

  • 我喜欢“尚不支持”错误消息 - 非常自觉
【解决方案2】:
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)

【讨论】:

  • 谢谢,您的解决方案帮助我理解了上一个。两者都工作正常。
【解决方案3】:

选择 s.* 从学生的加入 (选择前3年级 来自学生 按年级分组 按等级排序
) g3 在 s.grade = g3.grade;

【讨论】:

  • TOP 用于另一个 dbms 产品。
  • 此解决方案无效。我认为 TOP 不适用于 MySQL。
猜你喜欢
  • 1970-01-01
  • 2022-11-07
  • 2021-03-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多