mysql列中某个值不存在的条件

h6my8fg2  于 2021-06-18  发布在  Mysql
关注(0)|答案(2)|浏览(344)

我的想法是,我需要列出所有从来没有失败过的学生,这包括学生还没有参加任何考试。有几点: studentId 是学生的唯一id。 studentLastname 显然是学生的姓。 examEntryStudentId 是学生的唯一id外键。 examEntryNumber 是学生的唯一考试编号。 examInfoNumber 是相同的,但在 ExamInfo table。 examInfoPassed 确定学生是否通过,1表示通过(超过50%),0表示不及格。
我的想法是从 StudentExamEntryExamInfo . 我希望所有的学生首先可能被选中,因为那些年轻的学生还没有参加正式的考试,所以我正在利用 LEFT JOIN 因此,所有被选中,否则它们不会出现,因为它们不包含在 examEntryStudentId 因为不是所有的学生都参加了考试。此外,您还可以使用 ExamEntry 要遍历到 ExamInfo 存储学生是否考试不及格数据的表。此数据存储在 examInfoPassed 如果一个学生曾经拥有 0examInfoPassed 这意味着他们应该是唯一的学生不包括在我的输出。
这是我的初始代码:

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 然后从输出中删除它们。另外,没有参加任何测试的学生也不包括在我的输出中。

dsf9zpds

dsf9zpds1#

改为使用聚合:

SELECT 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
GROUP BY  l.studentId, l.studentLastname
HAVING MIN(a.examInfoPassed) = 0 OR MIN(a.examInfoPassed) IS NULL;
k75qkfdt

k75qkfdt2#

根据您的sql代码,当前您的查询报告至少通过了考试的所有学生,而您需要通过所有考试的学生。此外,从未通过任何考试的学生也被排除在外,因为 WHERE 子句引用来自联接表的列。
你需要改变你的逻辑:
使用 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

相关问题