Mysql 筛选尚未通过科目的学生
我有一个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
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;