mysql - SQL:打破与子查询的联系
问题描述
假设我有一个signed_up
带有列的 MySQL 表student_id, course_id, and marks
。我想为每个学生取回student_id, course_id
和最大值mark
。如果学生mark
在多门课程中获得相同的成绩,我想取最小的那一行course_id
。最后,我想显示这些按递增排序的结果student_id
。
这是我的尝试,它给出了不正确的输出:
select student_id, course_id, max(grade) from signed_up
where course_id =
(select min(course_id) from signed_up s where s.student_id = student_id)
group by student_id, course_id
order by student_id asc;
我得到一个结果集,从哪里course_id
开始都是 1。这让我觉得我在where
子句中弄乱了我的子查询。
有什么建议么?
解决方案
我相信这可以满足您的要求:
select su.student_id, su.course_id, su.grade
from signed_up su
where (su.course_id, su.grade) = (select su2.course_id, su2.grade
from signed_up su2
where su2.student_id = su.student_id
order by su2.grade desc, su2.course_id
);
这将获得每个学生的最高成绩以及具有该成绩的课程。如果有重复,则选择 id 较小的课程。
你也可以group by
用一些技巧来表达这个:
select su.student_id,
substring_index(group_concat(su.course_id order by grade desc, course_id asc), ',', 1) as course_id,
max(su.grade)
from signed_up su
group by su.student_id;
推荐阅读
- maven - Maven 插件可以使用构建依赖项吗?
- ios - Swift语言的StructName.init是什么意思?
- javascript - Oracle Apex IR 图表中的阿拉伯字母
- python - 如何检查列表中的连续负数或正数以及python中的条件?
- c# - 在 dotnet core 3.0 中使用 [Authorize]-attribute 时修改响应内容
- ios - UIView 应该观察通知吗?
- python - 如何使用列表项创建不同的输出?
- python - TensorFlow 2.0.0 ValueError:没有为任何变量提供渐变:['Variable:0']
- python - Python 日志记录终止
- r - 基准实验中使用的学习器的特征重要性 - mlr