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);
或类似的东西
我有 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);
或类似的东西