MySQL条件排除了一些需要的记录

MySQL条件排除了一些需要的记录,mysql,Mysql,我想在MySQL中加入5个表,以返回注册课程的学生列表、他们注册的课程、这些课程中的作业以及学生在每个作业中获得的分数(如果学生尚未完成作业,则为空) 我想返回: 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, Scien

我想在MySQL中加入5个表,以返回注册课程的学生列表、他们注册的课程、这些课程中的作业以及学生在每个作业中获得的分数(如果学生尚未完成作业,则为空)

我想返回:

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子句,我会得到所有作业的列表,但是成绩和作业不匹配。作业评分表需要与学生、作业和课程关联,以便正确报告

我如何重写此文件以仅返回注册课程的学生、这些课程中的作业以及每个作业的分数,即使作业尚未评分

非常感谢你给我的建议!
Kimber

只要将上一个
中的标准放在
上,就可以解决这个问题:

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

您需要将
WHERE
条件移动到
子句上的左join
,否则您将过滤掉没有要显示的等级的所有行,而不是按预期将它们设置为
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

.

谢谢您如此详细的回复!
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