我希望获得通过所有科目的学生数量(标记> = 4)。
前:
学生1(确定):
- 数学:5
- 化学:4
学生2(确定):
- 哲学:7
学生3(不行):
- 数学:3
- 哲学:6
学生4(不行):
- 数学: null
- 哲学:8
DB:
-students(ID)
-subjects_students(id_subject,id_student,mark)
SQL(使用MySQL):
SELECT count(ss.id_student)
FROM subjects_students ss
WHERE (SELECT count(ss.id_student)
FROM students st
WHERE ss.id_student = st.id)
=
(SELECT count(ss.id_student)
FROM students st
WHERE ss.id_student = st.id
AND ss.mark >= 4)
我似乎得不到合适的金额。我得到的学生已通过一些科目,但不是全部。
编辑:标记可以 null 。不要指望这些。
ANSWER :
SELECT COUNT(*)
FROM
(
SELECT COUNT(ss.id_student)
FROM subjects_students ss
GROUP BY ss.id_student
HAVING MIN(ss.mark) >= 4 AND COUNT(ss.mark) = COUNT(*)
) src;
答案 0 :(得分:4)
如果您希望学生通过所有他们的科目,那么您想要过滤掉那些标记太低的学生。这是一种方法:
SELECT ss.id_student
FROM subjects_students ss
GROUP BY ss.id_student
HAVING MIN(ss.mark) >= 4;
然后,您可以将此作为子查询计算。
请注意,不需要加入students
表。您需要的所有信息都在subjects_students
。
答案 1 :(得分:0)
这应该加入学生和主题表,然后删除任何成绩不及格的学生。
SELECT
a.`id`,
c.`id_subject`,
c.`mark`
FROM `students` a
LEFT JOIN `subjects_students` c
ON a.`id` = b.`id_student`
LEFT JOIN `subjects_students` b
ON a.`id` = b.`id_student` AND b.`mark` < 4
WHERE b.`id` IS NULL
GROUP BY a.`id`,c.`id_subject`,c.`mark`;
答案 2 :(得分:0)
我觉得戈登的方法在这里是另一个可能稍微慢一点的方法,但可以让你在没有两个步骤的同一查询中获得学生的数量。
SELECT COUNT(DISTINCT ss.id_student) as CountOfStudents
FROM
subjects_students ss
WHERE
NOT EXISTS (SELECT 1 FROM subjects_students ss2 WHERE ss.id_student = ss2.id_student AND ss2.mark < 4)