Mysql 左外部联接以返回特定数据

Mysql 左外部联接以返回特定数据,mysql,database,left-join,Mysql,Database,Left Join,我有两个表,其中一个是相关表,另一个是基表。第一个是班级,另一个是学生。我需要返回班级中某个学生的所有相关班级数据,以及学生未注册的班级的班级信息。(student.id引用班级拥有的student.student\u id) 当我传递student.id时,我需要从class_has_student获取信息,class_has_student.class_id用于相关数据,如果学生未注册到该类,则class_has_student.class_id为null。例如,如果我想获取John 1、2

我有两个表,其中一个是相关表,另一个是基表。第一个是班级,另一个是学生。我需要返回班级中某个学生的所有相关班级数据,以及学生未注册的班级的班级信息。(student.id引用班级拥有的student.student\u id)

当我传递student.id时,我需要从class_has_student获取信息,class_has_student.class_id用于相关数据,如果学生未注册到该类,则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);
小提琴在这儿。

这应该可以解决问题

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 ); 
这将把班级的学生行与注册班级的学生进行匹配,然后对照所有班级的列表,以查看他们注册和未注册的班级,然后将其限制为您感兴趣的班级

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

或者类似的事情

也许谢谢你的回答。但它返回所有类的数据。我要求它只为指定的类返回。在这种情况下只有1,2,3。非常感谢。这很有效。仅使用class_has_student和student only并显示chs.class_id是否可以实现这一点。如果不能,请解释原因(仅用于知识目的。无需担心)。您必须滥用group by才能使用这两个表,正如其他人所做的那样。这是不好的,因为没有聚合函数,为student_id选择的值可能是不确定的。有关更深入的解释,请参见另一个问题。顺便说一句,如果你喜欢这个答案,你能接受吗?:)
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);