首页 文章

未出现的列中的值的mySQL条件

提问于
浏览
0

我的想法是,我需要列出所有从未失败的学生,这包括尚未参加任何考试的学生 . 几点:

studentId 是学生的唯一身份证件 .
studentLastname 显然是学生的姓 .
examEntryStudentId 是学生唯一的ID外键 .
examEntryNumber 是学生的唯一考试号码 .
examInfoNumber 是相同的,但在 ExamInfo 表上 .
examInfoPassed 确定学生是否通过,1表示他们通过(超过50%),0表示他们失败 .

我的想法是,我遍历表格从 StudentExamEntryExamInfo . 我希望所有的学生首先可能被选为那些年龄较小的学生尚未参加官方考试,所以我正在使用 LEFT JOIN 以便所有学生都被选中,因为他们不会出现因为他们不是由于并非所有学生都参加考试,因此包含在 examEntryStudentId 内 . 此外,然后使用 ExamEntry 表遍历 ExamInfo 表,其中存储了学生是否通过考试的数据 . 这些数据存储在 examInfoPassed 下,因此如果学生在 examInfoPassed 中曾经拥有 0 的值,则意味着他们应该是未包含在我的输出中的唯一学生 .

这是我的初始代码:

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 的类别,那么它们将从输出中删除 . 未参加任何测试的学生也不包括在我的输出中 .

2 回答

  • 1

    根据您的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
    
  • 0

    改为使用聚合:

    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;
    

相关问题