Mysql 计算通过所有科目的学生人数
我想得到通过所有科目分数>=4的学生人数 例: 学生1OK: 数学:5 化学:4 学生2OK: 哲学:7 学生3不好: 数学:3 哲学:6 学生4不正常: 数学:空 哲学:8 DB: -学生席 -科目\学生SID \科目,id \学生,马克 使用MySQL的SQL:Mysql 计算通过所有科目的学生人数,mysql,sql,Mysql,Sql,我想得到通过所有科目分数>=4的学生人数 例: 学生1OK: 数学:5 化学:4 学生2OK: 哲学:7 学生3不好: 数学:3 哲学:6 学生4不正常: 数学:空 哲学:8 DB: -学生席 -科目\学生SID \科目,id \学生,马克 使用MySQL的SQL: SELECT count(ss.id_student) FROM subjects_students ss WHERE (SELECT count(ss.id_student) FROM students st
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)
我似乎拿不到合适的数量。我有一些学生通过了一些科目,但不是全部
编辑:标记可以为空。不要数这些
答复:
这应该加入学生和科目表,然后删除任何科目成绩不及格的学生
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`;
如果你想要所有科目都及格的学生,那么你就要过滤掉那些分数太低的学生。这里有一种方法:
SELECT ss.id_student
FROM subjects_students ss
GROUP BY ss.id_student
HAVING MIN(ss.mark) >= 4;
然后,您可以将其作为子查询来计算学生人数
请注意,不需要连接到students表。你需要的所有信息都是关于学生的。我很喜欢Gordon的方法这里还有另一种可能会稍微慢一点,但不需要两个步骤就可以计算出同一查询中的学生人数
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)
找到至少一门学科不及格的学生,然后将其从学生列表中删除可能会更容易。您是否也要计算没有任何科目记录的学生,因为他们还没有任何科目不及格?不,只是通过了所有科目的学生。忘了告诉他们分数可以为空。我如何避免它?所以空表示我不知道?Gordon的方法仍然有效,除非您想消除给定类中没有标记的任何人,在这种情况下,您将使用MINCOALESCEss.mark,0>=4。另一种方法是找到值的和,值的计数,并将和除以计数,然后将其与传递的值进行比较。@Leo。空分怎么办?空分意味着还没有得分。所以这是一个未经批准的主题。科目标记为空的学生不应计算在内。
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)