假设我有一个带有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
子句中弄乱了我的子查询。
有什么建议吗?
答案 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;