【问题标题】:MySQL query select students who do not have all 'A' gradeMySQL查询选择没有全部'A'成绩的学生
【发布时间】:2015-05-21 19:07:32
【问题描述】:

我有两张桌子,gradereportstudent

gradereport 表有 studentNo,它是来自 student 表的外键,它也有每个学生的成绩,

我必须查询 gradereport 表来找出哪些学生在他们所修的课程中没有全部成绩为“A”。

如果他们的成绩不是“A”,那么他们不应该被包括在结果中。

我如何查询表 gradereport 以查找课程中没有全“A”的学生。

成绩报告表

学生桌

【问题讨论】:

    标签: php mysql database database-administration


    【解决方案1】:

    成绩不全A的学生可以找到

    select s.*,
    gr.section,
    gr.grade 
    from student s 
    join gradereport gr on gr.studentNo = s.studentnumber 
    group by s.studentnumber,gr.section 
    having sum(gr.grade='A') <> count(*) ;
    

    或者如果你不关心section 那么

    select s.* 
    from student s 
    join gradereport gr on gr.studentNo = s.studentnumber 
    group by s.studentnumber 
    having sum(gr.grade='A') <> count(*)
    

    【讨论】:

    • 这行得通,找到只有所有'A'成绩的学生的反面是什么?
    • 简单,只需将have子句更改为having sum(gr.grade='A') = count(*)
    • 根据表的大小,这个查询可能需要一些时间来计算,因为有子句重新评估查询......你应该只做一个排除连接
    【解决方案2】:

    你可以像这样进行排他性检查

    SELECT distinct studentno FROM gradereport gr
    WHERE gr.grade = "A"
    AND NOT EXISTS
    (   SELECT 1
        FROM gradereport
        WHERE grade <> "A"
        AND studentno = gr.studentno
    )
    

    DEMO

    您也可以进行独占加入(我的偏好)

    SELECT DISTINCT gr.studentno
    FROM gradereport gr
    LEFT JOIN gradereport gr1 ON gr1.studentno = gr.studentno AND gr1.grade <> "A"
    WHERE gr1.studentno is null 
    

    BETTER DEMO

    【讨论】:

      【解决方案3】:

      试试这个:

      SELECT student.name, student.number
      FROM student, gradereport
      WHERE student.number = gradereport.StudentNumber
      AND gradereport.Grade != 'A'
      

      【讨论】:

      • 这不起作用,它返回“Bob brown”——这个学生的成绩单上的成绩都是“A”,他的 studentNo 是 8。
      • 它有效,有什么方法可以更改查询以获取所有'A'成绩的学生,即'bob brown'?
      【解决方案4】:

      找出所有至少一个成绩为 A 的学生:

      SELECT DISTINCT `StudentNo` FROM `gradereport` WHERE `Grade` = 'A'
      

      寻找相反的结果:

      SELECT `StudentNo` FROM `gradereport` WHERE `StudentNo` NOT IN (SELECT DISTINCT `StudentNo` FROM `gradereport` WHERE `Grade` = 'A')
      

      【讨论】:

      • 第一个查询有效,第二个查询在子查询中给我错误
      • 这只是获得至少 1 个“A”的学生,而不是所有的“A”。
      • 修复了第二个查询,该查询应显示所有“课程中没有全 A”的学生,就像您在问题中所写的那样。 @lase 第二个查询是主要查询第一个只是为了解释我是如何得到第二个的。
      【解决方案5】:

      我会这样做:

      SELECT DISTINCT StudentNo FROM gradereport GR WHERE NOT EXISTS ( SELECT 1 FROM gradereport GR2 WHERE GR.StudentNo = GR2.StudentNo AND GR2.Grade != 'A' )

      【讨论】:

      • 和我的一模一样
      猜你喜欢
      • 1970-01-01
      • 2011-01-10
      • 1970-01-01
      • 2016-04-02
      • 2015-03-31
      • 1970-01-01
      • 1970-01-01
      • 2013-02-10
      • 1970-01-01
      相关资源
      最近更新 更多