sql:与子查询打成一片

zazmityj  于 2021-06-25  发布在  Mysql
关注(0)|答案(2)|浏览(191)

假设我有一个mysql表 signed_up 带列 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 条款。
有什么建议吗?

aydmsdu9

aydmsdu91#

希望以下查询能有所帮助:

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;
v6ylcynt

v6ylcynt2#

我相信这正是你想要的:

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;

相关问题