【问题标题】:Get the count of students who have passed all of their subjects获取通过所有科目的学生人数
【发布时间】:2017-06-25 10:26:00
【问题描述】:

我想知道通过所有科目的学生人数(分数 >= 4)。

例如:

学生 1(好的):

  • 数学:5
  • 化学:4

学生 2(好的):

  • 理念:7

学生 3(不行):

  • 数学:3
  • 理念:6

学生 4(不行):

  • 数学:null
  • 理念:8

数据库:

-学生(身份证)

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

我似乎无法获得正确的金额。我有学生通过了一些科目,但不是全部。

EDIT:标记可以为null。不要算这些。

回答

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;

【问题讨论】:

  • 找到至少一门科目不及格的学生可能会更容易,然后将其从学生列表中删除。
  • 您是否也想计算在subjects_students中没有任何条目的学生,因为他们还没有任何科目不及格?
  • 不,只是通过所有科目的学生。

标签: mysql sql


【解决方案1】:

如果您希望学生通过所有他们的科目,那么您希望过滤掉分数过低的学生。这是一种方法:

SELECT ss.id_student
FROM subjects_students ss
GROUP BY ss.id_student
HAVING MIN(ss.mark) >= 4;

然后您可以将其用作子查询来计算学生人数。

请注意,连接到students 表是不必要的。您需要的所有信息都在subjects_students 中。

【讨论】:

  • 忘记告诉标记可以为空。我该如何避免呢?
  • 所以 null 的意思是“我不知道”? Gordon 的方法仍然有效,除非您想消除给定类中没有标记的任何人,在这种情况下,您将获得 "MIN(COALESCE(ss.mark, 0)) >= 4。
  • 解决此问题的另一种方法是找到总和,值的计数,然后将总和除以计数,然后将其与“通过”的值进行比较。
  • @Leo 。 . . NULL 标记应该发生什么?
  • null 表示尚未评分。所以这是一个未经批准的主题。科目为空的学生不应计入。
【解决方案2】:

这应该加入学生和科目表,然后删除所有科目成绩不及格的学生。

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`;

【讨论】:

    【解决方案3】:

    我确实喜欢 Gordon 的方法,这是另一种可能稍慢但无需 2 个步骤即可让您在同一个查询中计算学生人数的方法。

    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)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-05-08
      • 1970-01-01
      • 1970-01-01
      • 2018-05-29
      • 1970-01-01
      相关资源
      最近更新 更多