Mysql 左外部联接以返回特定数据
我有两个表,其中一个是相关表,另一个是基表。第一个是班级,另一个是学生。我需要返回班级中某个学生的所有相关班级数据,以及学生未注册的班级的班级信息。(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就足够了)。所以结果一定是,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
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);