2013-05-28 2 views
0

나는 MySQL에 가입하여 코스에 등록한 학생 목록, 등록한 코스, 해당 코스의 과제 및 학생의 성적을 반환하고자합니다. 각 과제마다 벌 수 있습니다 (학생이 과제를 완료하지 않은 경우 NULL).MySQL 조건 일부 제외 레코드

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 

(데이터 없음 야곱 그가 어떤 과정에 등록되어 있지 않기 때문에)

내 쿼리 :

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 

이 결과는 포함

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 

나는 돌아 오지 싶어 학생과 과목은 예상대로이지만, 모든 과제 대신에 학생이 완료 한 성적과 과제 만 c 완료 또는하지 않습니다. WHERE 절을 제거하면 모든 과제 목록이 표시되지만 성적과 과제가 서로 일치하지 않습니다. assignment_grades 테이블은 올바르게보고하기 위해 학생, 과제 및 코스에 참여해야합니다.

과제를 채점 한 학생, 과제의 과제 및 과제가 채점되지 않은 경우 각 과제의 성적 만 반환하려면 어떻게 다시 작성해야합니까?

어떤 조언을 해주셔서 너무 감사드립니다! 킴버

답변

0

를 왼쪽 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 

An SQLfiddle to test with.

+1

이와 같은 자세한 답변을 보내 주셔서 감사합니다. –

2

그냥 수정해야 마지막 ONWHERE에서 기준을두고 : 당신은 당신의 WHERE 상태를 이동해야

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 
    AND ag.assignmentid=a.id 
    AND ag.courseid=c.id