LEFT OUTER JOIN返回特定数据

时间:2015-03-28 11:12:27

标签: mysql database left-join

我有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。例如,如果我想获得John的类1,2和3的类注册信息。我期望的结果是类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

2 个答案:

答案 0 :(得分:0)

这应该可以解决问题。

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

这将匹配该类有学生行给在类中注册的学生,然后针对所有类的列表,以查看他们是什么类并且没有注册,然后将其限制为仅你感兴趣的课程。

答案 1 :(得分:0)

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

或类似的东西