【发布时间】:2021-03-06 05:20:01
【问题描述】:
我很想知道我们是否可以避免内部查询并在连接之前使用连接来获取另一个表的顶部元素。
例如,有一个“students”表和另一个代表“student_marks”的表,它代表学生在个别科目中的分数。 现在我想为每个学生列出他在所有科目中的最高分。
student
-----------------------------
| student_id | name | Age |
-----------------------------
| S1 | Biden | 15 |
| S2 | Jordan | 16 |
-----------------------------
student_marks
-------------------------------------
| student_id | subject | marks |
-------------------------------------
| S1 | Geology | 80 |
| S1 | Trigonometry | 90 |
| S2 | Geography | 70 |
| S2 | Geology | 75 |
-------------------------------------
想要的结果如下:
----------------------------------------------------
| student_id | name | age | subject | marks |
----------------------------------------------------
| S1 | Biden | 15 | Trigonometry | 90 |
| S2 | Jordan | 16 | Geology | 75 |
----------------------------------------------------
由于我用的是MySql,所以不能用with子句
我的尝试是
select * from
student s
inner join (
select student_id, max(marks) as marks from student_marks group by student_id
) max_student_marks sm
on s.student_id = sm.student_id;
PS:上述方法确实给出了预期的结果(没有主题列),但随着数据量的增加运行速度非常慢。那么有没有更好的方法来利用连接并从用于连接的辅助表中选择顶部元素。
【问题讨论】:
-
'由于我使用的是 MySql,所以我不能使用 with 子句'-从第 8 版开始你可以..你在哪个版本上?
-
我正在使用 5.17 或 5.2 类似的东西。无法真正升级到 8 :|
-
@Jake 您发布的查询未返回列
subject。
标签: mysql sql inner-join greatest-n-per-group