我有一个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次。
但是学生可以尝试直到他/她通过。
但有些仍然失败。
因此,我希望得到仍然无法通过该主题的学生的Reg.No
例如:112119
和112107
仍无法通过其主题
我无法为此问题编写查询。
答案 0 :(得分:2)
我建议使用聚合:
SELECT `Reg.No`, SubjectCode, SUM(`Pass/Fail` = 'Pass')
FROM results
GROUP BY `Reg.No`, SubjectCode
HAVING SUM(`Pass/Fail` = 'Pass') = 0;
HAVING
子句计算每个学生和最后一列为'Pass'
的课程的结果数。在MySQL中,布尔值在数值上下文中被视为整数,其中true为1.因此,sum(
通过/失败= 'Pass')
计算学生通过课程的次数。 = 0
表示学生从未通过该课程。
作为建议,请勿在列名中添加/
和.
等特殊字符。这需要转义列,只是让代码更难写,因为它填充了反引号。
答案 1 :(得分:1)
你不需要这个子查询。
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'
。
你只会找到尝试失败的学生,而不是那些从未尝试过的学生(根本不在这个表中)。
我真的不会将列名用在特殊字符上。非常容易出错。
答案 2 :(得分:0)
喜欢这个? <击> 击>
<击>SELECT Req.No FROM results WHERE `Pass/Fail` = 'fail';
这是非常基本的SQL。你应该阅读一些教程。
击>
编辑:好好玩了一下后,我来到了这个问题:
SELECT `Req.No` FROM results WHERE `Req.No` NOT IN(SELECT `Req.No` FROM results WHERE `Pass/Fail` = 'pass');