Mysql 筛选尚未通过科目的学生

Mysql 筛选尚未通过科目的学生,mysql,sql,Mysql,Sql,我有一个MySql表,它有以下值: 表名称“结果” Reg.No SubjectCode Attempt Pass/Fail 112108 CMIS 1113 1 fail 112110 CMIS 1114 1 pass 112119 CMIS 1114 1 fail 112108 CMIS 1113 2 fail 112107 CMIS 1113 1 fail 112108 C

我有一个MySql表,它有以下值:

表名称“结果”

Reg.No  SubjectCode  Attempt  Pass/Fail
112108  CMIS 1113    1        fail
112110  CMIS 1114    1        pass
112119  CMIS 1114    1        fail
112108  CMIS 1113    2        fail
112107  CMIS 1113    1        fail
112108  CMIS 1113    3        pass
学生可以多次尝试通过该科目。 学生应通过每门课程才能获得学位。 有些学生第一次尝试就通过了。 有些人尝试了3次以上。 然而,学生可以尝试,直到他/她通过。 但有些仍然失败。 所以我想得到仍然无法通过这门课程的学生的注册号。 112119和112107仍然无法通过他们的科目。 我无法为这个问题编写查询。

像这样吗?

这是非常基本的SQL。你应该读一些教程。

编辑:好的,在玩了一会儿之后,我来到这个查询:

从结果中选择'Req.No',其中'Req.No'不插入从结果中选择'Req.No',其中'Pass/Fail`='Pass';
您不需要对此进行子查询

SELECT `Req.No`, `SubjectCode`, max(`Pass/Fail`) AS `Pass/Fail`
FROM   results
GROUP  BY 1, 2
HAVING max(`Pass/Fail`) = 'fail'
假设Pass/Fail是字符串类型,那么“Pass”>Fail。 你只得到那些尝试过但失败的学生,而不是那些从未尝试过但根本不在这张桌子上的学生


我真的不会用带有特殊字符的列名。非常容易出错。

我建议使用聚合:

SELECT `Reg.No`, SubjectCode, SUM(`Pass/Fail` = 'Pass')
FROM results
GROUP  BY `Reg.No`, SubjectCode
HAVING SUM(`Pass/Fail` = 'Pass') = 0;
HAVING子句统计每个学生和课程的成绩数,其中最后一列为“通过”。在MySQL中,布尔值在数字上下文中被视为整数,true为1。因此,sumPass/Fail='Pass'计算学生通过课程的次数。=0表示该学生从未通过该课程


建议不要使用特殊字符,如/和。在列名中。这需要转义列,只会使代码更难编写,因为它充满了反勾号。

您至少试过了吗?您只对给定的科目代码感兴趣还是对所有科目感兴趣?这不是我想要的查询。此查询提供所有不及格学生的注册号。但我希望获得仍然无法通过该科目的学生的注册号。例如112119仍然无法通过CMIS 1114和112107仍然无法通过CMIS 1113。我只想筛选这两个。112108在他的第三次尝试中通过主题。所以不要他的号码。我只想要仍然无法通过主题的人。我希望你明白我的意思。谢谢。我现在明白你的意思了。请将该描述添加到原始问题中。您可能需要修改您的桌子,但不确定。谢谢您,先生,您能建议对我的桌子进行任何修改吗?@Punuth这不是您想要的。此查询显示至少一次未通过给定考试的所有注册号。@Begueradj是的,先生。这不是我要找的。您有什么解决方案吗?谢谢您,先生。您的查询对我来说非常有效。是的,我是SQL的新手。我仍然在学习和实践它。谢谢你的建议。是的,先生。我以后会把你的建议付诸实践。不管怎样,你的查询对我来说是有用的。谢谢你的帮助。
SELECT `Reg.No`, SubjectCode, SUM(`Pass/Fail` = 'Pass')
FROM results
GROUP  BY `Reg.No`, SubjectCode
HAVING SUM(`Pass/Fail` = 'Pass') = 0;