我的想法是,我需要列出所有从未失败过的学生,其中包括尚未参加任何考试的学生。几点:studentId
是学生的唯一ID。studentLastname
显然是学生的姓氏。examEntryStudentId
是学生的唯一ID外键。examEntryNumber
是学生的唯一考试编号。examInfoNumber
相同,但在ExamInfo
表上。examInfoPassed
确定学生是否通过; 1表示学生通过(50%以上),0表示学生失败。
我的想法是我遍历从Student
到ExamEntry
到ExamInfo
的表。我希望首先选择所有学生,因为较年轻的学生尚未参加过官方考试,所以我使用了LEFT JOIN
以便使所有学生都被选中,否则他们将不会出现未包含在examEntryStudentId
中,因为并非所有学生都参加了考试。此外,然后使用ExamEntry
表遍历到ExamInfo
表,在该表中存储学生是否考试不及格的数据。此数据存储在examInfoPassed
下,因此,如果某个学生在0
中具有examInfoPassed
的值,则意味着他们应该是我的输出中不包括的唯一学生。
这是我的初始代码:
SELECT DISTINCT l.studentId, l.studentLastname
FROM Students l
LEFT JOIN ExamEntry e
ON l.studentId = e.examEntryStudentId
JOIN ExamInfo a
ON e.examEntryNumber = a.examInfoNumber
WHERE NOT a.examInfoPassed = 0
;
尽管我目前的输出是所有通过考试的学生,包括以前未通过考试的学生。我不确定如何创建条件,这意味着如果您属于
NOT a.examInfoPassed = 0
类别,则会将其从输出中删除。同样,未参加任何考试的学生也未包含在我的输出中。 最佳答案
根据您的sql代码,当前您的查询报告至少已通过考试的所有学生,而您希望已通过所有考试的学生。另外,由于WHERE
子句引用了来自JOINed表的列,因此未通过任何考试的学生也被排除在外。
您需要更改逻辑:
使用LEFT JOIN
检测至少一项考试不及格的人
然后将它们排除在WHERE
子句中(与此同时,这将使从未参加过考试的学生被包含在输出列表中)。
查询:
SELECT DISTINCT l.studentId, l.studentLastname
FROM Students l
LEFT JOIN ExamEntry e ON l.studentId = e.examEntryStudentId
LEFT JOIN ExamInfo a ON e.examEntryNumber = a.examInfoNumber AND a.examInfoPassed = 0
WHERE a.examInfoNumber IS NULL
关于mysql - 列中的值的mySQL条件未发生,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/53697303/