MySQL - 仅当WHERE子句中的所有值都存在时才返回行

时间:2017-02-24 16:02:55

标签: mysql sql

我有一个存储考试记录的数据库:tbl_exams存储考试的ID和名称 - 只有9个考试,因此考试中只有9个记录,因为考试是固定的,不会改变。 tbl_exam_details存储考试条目的所有详细信息,并包含来自tbl_exams的相应ID - 对此有一个外键约束。我尝试做的是创建一个查询,只有当某个学生已经完成所有9项考试并且pass_or_fail字段为' 1' - 我使用tinyint(1)存储1传递,或0存在失败)。这主要是为了检查是否所有9项考试都已通过。

这是我到目前为止所做的,但是即使学生只完成了一两门考试,它也会返回行:

SELECT tbl_exam_details.student_id, exam_name, exam_date, pass_or_fail FROM tbl_exam_details
INNER JOIN tbl_exams ON tbl_exams.exam_id = tbl_exam_details.exam_id
WHERE student_id = 1 AND pass_or_fail = 1
AND tbl_exam_details.exam_id IN (1, 2, 3, 4, 5, 6, 7, 8, 9)
ORDER BY exam_details_id

我需要的是查询只有在通过所有9项考试后才返回行。因此,如果学生已通过8次考试,则查询应返回0行。如果有人能帮助我,我们将不胜感激。

3 个答案:

答案 0 :(得分:2)

SELECT ted.student_id, 
       exam_name, 
       exam_date, 
       pass_or_fail 
FROM tbl_exam_details ted
INNER JOIN tbl_exams 
   ON tbl_exams.exam_id = ted.exam_id
WHERE student_id = 1
  AND (SELECT COUNT(*)
       FROM tbl_exam_details ted2
       WHERE ted2.pass_or_fail = 1
         AND ted2.student_id = ted.student_id
      ) = 9  -- mean this student pass 9 exams
ORDER BY exam_details_id

答案 1 :(得分:1)

这是你想要的吗?

SELECT ed.student_id
FROM tbl_exam_details ed
WHERE ed.student_id = 1 AND ed.pass_or_fail = 1 AND
      ed.exam_id IN (1, 2, 3, 4, 5, 6, 7, 8, 9)
GROUP BY ed.student_id
HAVING COUNT(*) = 9;  -- or maybe COUNT(DISTINCT exam_id) = 9

这将返回已通过9项考试的学生ID。它不包含任何其他信息。

答案 2 :(得分:0)

您可以group_concat获取完整列表...

#first {
  border: 1px solid red;
}

#second {
  border: 1px solid green;
}