筛选尚未通过主题的学生

时间:2014-12-05 19:37:22

标签: 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  CMIS 1113    3        pass

学生可以多次尝试通过该科目。 学生应该通过每个科目获得学位。 有些学生第一次尝试通过。 有些人尝试超过3次。 但是学生可以尝试直到他/她通过。 但有些仍然失败。 因此,我希望得到仍然无法通过该主题的学生的Reg.No 例如:112119112107仍无法通过其主题 我无法为此问题编写查询。

3 个答案:

答案 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');

http://sqlfiddle.com/#!2/b2bd80/17