2017-02-24 66 views
0

我有一個存儲考試記錄的數據庫:tbl_exams存儲考試的ID和名稱 - 只有9個考試,因此該表中只有9條記錄考試是固定的,不會改變。 tbl_exam_details存儲考試條目的所有詳細信息,幷包含來自tbl_exams的相應ID - 這存在外鍵約束。我想要做的是創建一個查詢,返回行只有當所有9個考試已被某個學生採取,並且pass_or_fail字段爲'1' - 我使用tinyint(1)來存儲1通過,或0是失敗)。這主要是爲了檢查是否所有9個考試都已通過。MySQL - 僅在WHERE子句中存在所有值時才返回行

這是我迄今爲止,但它返回行,即使學生只完成一個或兩個考試:

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行。如果有人能幫助我,將不勝感激。

+1

你能編輯你的問題,並提供樣本數據和期望的結果嗎? –

+0

您可以創建一個'all_exams'列,當表被修改時它會自動更新。如果所有exam_id都設置,all_exams = 1,否則爲0。 – nncho

回答

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 
+0

爲什麼不'WHERE tbl_exam_details.pass_or_fail = 1 AND tbl_exam_details.student_id = ted.student_id'? – JohnHC

+0

@JohnHC是的,我正在修復。謝謝 –

+0

標記爲正確,因爲它也顯示我需要的額外字段。 – sinesine

0

可以GROUP_CONCAT一個完整的列表...

select x1.* 
from 
(
select t1.*, group_concat(distinct exam_id order by exam_id separator '|') as x_list 
from tbl_exam_details t1 
where pass_or_fail = 1 
group by student_id 
) x1 
where x_list = '1|2|3|4|5|6|7|8|9' 
+1

你可能需要在'concat'上添加命令? –

+0

這會產生一個錯誤:'#1248 - 每個派生表都必須有自己的別名' – sinesine

+0

@sinesine輕鬆修復... – JohnHC

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。它不包含任何其他信息。

+0

這就是它,謝謝!當它讓我時會接受正確的。出於好奇,你的意思是「或者COUNT(DISTINCT exam_id)= 9」? – sinesine

+0

@sinesine如果一次考試可以多次出現「通過」。但在這種情況下,你只能通過考試一次,所以不應該成爲一個問題。 –

+0

@Juan Carlos Oropeza我明白了,謝謝你的幫助。 – sinesine

相關問題