首页 > 解决方案 > 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子句中弄乱了我的子查询。

有什么建议么?

标签: mysqlsql

解决方案


我相信这可以满足您的要求:

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;

推荐阅读