这可能真的很基础,但我被卡住了!
我有两个表,一个显示学生所在的班级,另一个显示每个学生的成绩。我想找出特定班级中哪些学生没有成绩。
我写了这段代码作为起点,它查找班级中确实有成绩的学生的列表:
SELECT mem.student_id, mem.class_id
FROM class_memberships as mem
inner join grades as gr
on mem.student_id = gr.student_id
where mem.class_id = 12 and gr.grade_type = 18这是一种享受,但我真正需要的是班上没有成绩的学生,而不是有成绩的学生。我认为我可以正确连接成员资格表,如下所示,但它不起作用:
SELECT mem.student_id, mem.class_id
FROM class_memberships as mem
inner join grades as gr
on mem.student_id = gr.student_id
right join class_memberships as mem2
on mem.student_id = mem2.student_id
where mem.class_id = 12 and gr.grade_type = 18
and mem.student_id is null上面没有返回任何行,我知道有一个学生没有成绩。我遵循了google上的SQL right joins示例来达到上述目的。我猜这是因为“mem.student_id is null”条款不起作用,但谷歌上所有的小抄都说我需要它。
请帮帮我!我是SQL (和一般的编码)的新手,所以这可能是非常基础的,但是我在任何地方都找不到答案。谢谢:)
发布于 2016-07-30 04:23:54
你可能根本不需要3-way join:
SELECT student_id
FROM class_membership
LEFT JOIN grades ON (class_membership.student_id = grades.student_id
AND class_membership.class_id = grades.class_id)
WHERE grades.student_id IS NULLclass_membership已经列出了所有的学生,所以您只需要找出哪些学生没有成绩,这意味着他们的“成绩”条目将为空。
发布于 2016-07-30 04:23:35
实际上,你真的只需要在grades上做一个LEFT JOIN。无论是否存在相应的class_memberships记录,LEFT JOINs都将显示所有的grades记录。然后,您可以过滤掉没有成绩的记录
SELECT mem.student_id, mem.class_id
FROM class_memberships as mem
LEFT JOIN grades as gr ON mem.student_id = gr.student_id
WHERE mem.class_id = 12
AND gr.id IS NULL --I'm not sure what your pk field is for your grades table发布于 2016-07-30 04:23:42
SELECT mem.student_id, mem.class_id
FROM class_memberships as mem
inner join grades as gr
on mem.student_id = gr.student_id
where mem.class_id = 12
and gr.student_id NOT EXISTS (select student_id from class_memberships where class_membership is null)https://stackoverflow.com/questions/38666855
复制相似问题