我有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 );


这将与班级中有学生的行匹配到要注册班级的学生,然后针对所有班级列表进行查看,以查看他们是哪些班级并且没有注册,然后将其限制为仅您所选择的班级有兴趣。

10-04 11:50
查看更多