Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 计算通过所有科目的学生人数_Mysql_Sql - Fatal编程技术网

Mysql 计算通过所有科目的学生人数

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

我想得到通过所有科目分数>=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
       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)