2011-12-06 30 views
1

我在想,如果我在下面的例子中使用子查詢的解決方案是最優化的方式:何時(不)在JOIN語句中使用子查詢?

SELECT 
    group_id, 
    student_completed_lectures.student_id, 
    count(student_completed_lectures.lecture_id) as completed_lectures_count 
FROM group 
LEFT JOIN group_students ON (group_students.group_id = group.id AND group_students.year = 2011) 
LEFT JOIN student_completed_lectures ON (
    student_completed_lectures.student_id = group_students.student_id AND 
    student_completed_lectures.lecture_id IN ( 
     SELECT lecture_id 
     FROM lecturesets 
     WHERE lecturesets.id = group.lectureset_id)) 
GROUP BY student_completed_lectures.student_id 

的想法是算多少講課學生已經從過去已經分配給他的小組完成。

+0

像你的問題不應該使用子查詢 – ajreal

+0

你是什麼意思? – Henno

+0

這不會限制要連接的行數嗎? – Henno

回答

0

如果你想限制的結果,你應該做這樣的

SELECT 
group_id, 
student_completed_lectures.student_id, 
count(student_completed_lectures.lecture_id) as completed_lectures_count 
FROM group 
LEFT JOIN group_students ON (group_students.group_id = group.id AND group_students.year = 2011) 
LEFT JOIN student_completed_lectures ON (
student_completed_lectures.student_id = group_students.student_id) 
WHERE student_completed_lectures.lecture_id IN( 
    SELECT lecture_id 
    FROM lecturesets 
    WHERE lecturesets.id = group.lectureset_id) 
GROUP BY student_completed_lectures.student_id 
相關問題