现有 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
来做...(如果回复有我会再说明的)
1
wisunny 2020-09-19 17:26:22 +08:00 via Android
exists
|
2
TimePPT 2020-09-19 18:25:35 +08:00 via Android 2
想了下,试试用 case when then else 把及格不及格二值化(及格赋值 1,不及格 0 ),然后 group by 求和,和大于 0 的及格,等于 0 的不及格
|
3
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 |
4
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
|
5
awen233333 2020-09-20 11:12:21 +08:00 via Android
having max(c.score)<60
|