获得通过所有科目的学生的数量

时间:2017-06-20 21:04:53

标签: mysql sql

我希望获得通过所有科目的学生数量(标记> = 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;

3 个答案:

答案 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)