LEFT OUTER JOIN 到 return 特定数据

LEFT OUTER JOIN to return specific data

我有 2 个 table,其中一个是相关 table,另一个是基础 table。第一个是 class_has_student,另一个是学生。我需要 return class_has_student 中特定学生的 classes 的所有相关数据和 classes 的 class 学生甚至没有注册的信息。 (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 class。例如,如果我想获取 John class 的 class 注册信息 1、2 和 3。我期望的结果与 class 学生数据有关 classes 1和 2 并且只有 class 信息 class 3(class table 未在此处显示,因此 returning 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);

fiddle 在这里。 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 ); 

这会将 class has student 行匹配到 classes 中注册的学生,然后对照所有 classes 的列表以查看什么class他们已经注册并且没有注册,然后将其限制为您感兴趣的 classes。

SELECT c.* 
  FROM class c 
  LEFT 
  JOIN 
     ( SELECT cs.class_id 
         FROM class_has_student cs 
         JOIN student s 
           ON s.id = cs.student_id 
          AND s.name = 'John'
     ) x 
    ON x.class_id = c.id 
 WHERE c.id IN (1,2,3);

或类似的东西