我有2个表,其中一个是相关表,另一个是基表。第一个是class_has_student,另一个是学生。我需要在class_has_student中返回特定学生的课程的所有相关数据,以及甚至没有注册学生的课程的课程信息。 (student.id引用class_has_student.student_id)
class_has_student table student table
class_id | student_id id | name
---------|----------- --------|---------
1| 1001 1001| John
2| 1001 1002| Michael
1| 1002 1003| Anne
3| 1002
1| 1003
2| 1003
3| 1003
4| 1003
当我传递student.id和class_has_student.class_id以获得相关数据时,我需要从class_has_student获取信息,如果学生未注册该课程,则需要为class_has_student.class_id传递null。例如,如果我想获取有关1、2和3类的John的课程注册信息,我期望的结果是与1和2类相关的班级学生数据,而只有3类的类信息(此处未显示类表,因此返回ID就足够了)。因此,结果必须是
class_id | student_id
---------|-----------
1| 1001
2| 1001
3| NULL
我试图通过以下查询和多种变体实现此目标,但未成功。如果有人可以提供帮助,我们深表感谢。
SELECT chs.class_id, s.id
FROM student s LEFT OUTER JOIN class_has_student chs ON s.id = chs.student_id AND s.id = 1001
WHERE chs.class_id IN(1,2,3);
小提琴在这里。
http://sqlfiddle.com/#!9/839fe/4
最佳答案
这应该可以解决问题。
SELECT c.id,
student_id
FROM class c
LEFT JOIN class_has_student chs
INNER JOIN student s
ON chs.student_id = s.id
AND s.id = 1001
ON c.id = chs.class_id
WHERE c.id IN ( 1, 2, 3 );
这将与班级中有学生的行匹配到要注册班级的学生,然后针对所有班级列表进行查看,以查看他们是哪些班级并且没有注册,然后将其限制为仅您所选择的班级有兴趣。