SQL:使用子查询断开连接

时间:2018-05-05 17:08:27

标签: 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子句中弄乱了我的子查询。

有什么建议吗?

2 个答案:

答案 0 :(得分:0)

希望以下查询有所帮助:

select su.student_id, min(su.course_id), su.grade from signed_up su where
su.grade = (select max(grade) from signed_up s where s.student_id = su.student_id)
group by su.student_id order by su.student_id asc;

答案 1 :(得分:0)

我相信这可以做你想要的:

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;