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