0

コースに登録されている学生のリスト、登録されているコース、それらのコースの課題、および学生が各課題で獲得した成績 (または NULL の場合は NULL) を返すために、MySQL に参加したい 5 つのテーブルがあります。生徒は課題を完了していません)。

table_students
id, name
1, John
2, Jacob
3, Jingleheimer
4, Schmidt

table_courses
id, name
20, English
30, Math 
40, Science

table_assignments
id, courseid, name
1, 20, English Assignment 1
2, 20, English Assignment 2
3, 20, English Assignment 3
4, 30, Math Assignment 1
5, 30, math Assignment 2
6, 40, Science Assignment 1
7, 40, Science Assignment 2
8, 40, Science Assignment 3
9, 40, Science Assignment 4

table_course_enrollments
studentid, courseid
1, 30
1, 40
3, 30
3, 20
4, 40

table_assignment_grades
studentid, courseid, assignmentid, grade
1, 30, 4, A
1, 40, 6, C
1, 40, 8, B
1, 40, 9, A
3, 30, 4, D

戻りたい:

Student Name,Course Name, Assignment Name, Grade
John, Math, Math Assignment 1, A
John, Math, Math Assignment 2, Null
John, Science, Science Assignment 1, C
John, Science, Science Assignment 2, Null
John, Science, Science Assignment 3, B
John, Science, Science Assignment 4, D
Jingleheimer, Math, Math Assignment 1, D
Jingleheimer, Math, Math Assignment 2, Null
Jingleheimer, English, English Assignment 1, Null
Jingleheimer, English, English Assignment 2, Null
Schmidt, Science, Science Assignment 1, Null
Schmidt, Science, Science Assignment 2, Null
Schmidt, Science, Science Assignment 3, Null
Schmidt, Science, Science Assignment 4, Null

(Jacob はどのコースにも登録していないため、データはありません)

私のクエリ:

SELECT table_students.name, table_courses.name, table_assignments.name, table_assignment_grades.grade

FROM table_students AS s
JOIN table_course_enrollments AS ce ON ce.userid=s.id
JOIN table_courses AS c ON c.id=ce.courseid
JOIN table_assignments AS a ON a.courseid=c.id
LEFT JOIN table_assignment_grades AS ag ON ag.userid=u.id

WHERE ag.assignmentid=a.id
AND ag.courseid=c.id

結果には、期待どおりに学生とコースが含まれますが、完了したかどうかに関係なく、すべての課題ではなく、学生が完了した成績と課題のみが含まれます。WHERE 句を削除すると、すべての課題の一覧が表示されますが、成績と課題が一致しません。正しく報告するには、assignment_grades テーブルを学生、課題、およびコースに結合する必要があります。

これを書き直して、コースに登録されている学生、それらのコースの課題、および課題が採点されていない場合でも各課題の成績のみを返すにはどうすればよいですか?

ヒントをありがとう!キンバー

4

2 に答える 2

0

WHERE条件を左の結合句に移動する必要があります。そうしないと、期待どおりONに設定するのではなく、表示する成績がないすべての行を除外します。NULL

SELECT s.name sname, c.name cname, a.name aname, ag.grade
FROM table_students AS s
JOIN table_course_enrollments AS ce ON ce.studentid=s.id
JOIN table_courses AS c ON c.id=ce.courseid
JOIN table_assignments AS a ON a.courseid=c.id
LEFT JOIN table_assignment_grades AS ag 
  ON ag.studentid=s.id
 AND ag.assignmentid=a.id
 AND ag.courseid=c.id
ORDER BY s.id,c.id

でテストする SQLfiddle

于 2013-05-28T20:03:59.227 に答える