请教一个 SQL 问题

2020-09-19 17:04:45 +08:00
 sockball07

现有 2 张表

course
    course_id  int   课程 ID
    score      float 课程得分,满分 100,60 及格
    student_id int   学生 ID

student
    student_id int   学生 ID
    name       int   学生姓名

一个学生可能有多个课程得分(即 student 一对多于 course )

现定义一个学生及格的条件为所有课程中只要有一门课程及格则算及格,只有所有课程不及格的情况下才算不及格

求所有及格的学生和所有不及格的学生。

及格很简单

SELECT
    s.student_id,
    s.name
FROM
    student s
INNER JOIN
    course c
ON
    s.student_id = c.student_id
WHERE
    c.score >= 60
GROUP BY
    student_id

但是不及格却不能直接以 WHERE c.score < 60 GROUP BY student_id 得出结果

问除了使用 ( NOT IN 及格的学生)的结果 还有什么比较好的方法?

此处只是模拟真实场景,实际上的条件比score >= 60要多,所以不应该特别针对此处使用MIN来做...(如果回复有我会再说明的)

1165 次点击
所在节点    问与答
5 条回复
wisunny
2020-09-19 17:26:22 +08:00
exists
TimePPT
2020-09-19 18:25:35 +08:00
想了下,试试用 case when then else 把及格不及格二值化(及格赋值 1,不及格 0 ),然后 group by 求和,和大于 0 的及格,等于 0 的不及格
chotow
2020-09-19 20:14:50 +08:00
SELECT s.name, c.score, c.course_id
FROM course AS c
JOIN student AS s ON s.student_id = c.student_id
LEFT JOIN course AS c_tmp ON c_tmp.student_id = c.student_id AND c.score < c_tmp.score
WHERE c_tmp.course_id IS NULL
AND c.score < 60

https://dev.mysql.com/doc/refman/8.0/en/example-maximum-column-group-row.html
wspsxing
2020-09-20 07:53:15 +08:00
select student_id, name, pass, cc from (select student_id, sum(score >= 60) as pass, count(score) as cc from course group by student_id)a join student as s on a.student_id = s.id where pass <= 0
awen233333
2020-09-20 11:12:21 +08:00
having max(c.score)<60

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/708582

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX