这可能是非常基本但我被卡住了!
我有两张桌子,一张用于显示学生所在的课程,另一张用于显示每位学生的成绩。我想知道哪些学生来自特定班级,没有成绩。
我把这段代码写成了一个起点,它找到了一个有成绩的班级中的学生列表:
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
上面没有返回任何行,我知道一个学生没有成绩。我按照谷歌上的示例进行SQL右连接以达到上述目的。我想这不起作用,因为' mem.student_id为null'条款,但谷歌上的所有备忘单都说我需要它。
请帮忙!我是SQL的新手(以及一般的编码),所以这可能是非常基本但我无法在任何地方找到答案。谢谢:))
答案 0 :(得分:1)
实际上,您只需在LEFT JOIN
上执行grades
。 LEFT JOIN
将显示所有class_memberships
条记录,无论是否有相应的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
答案 1 :(得分:1)
您可能根本不需要3方式连接:
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 NULL
class_membership
已经列出了所有学生,因此您只需要确定哪些学生没有成绩,这意味着他们的“成绩”条目将为空。
答案 2 :(得分:0)
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)
答案 3 :(得分:0)
您要找的是function request(val, callback) {
setTimeout(function() {
callback(val * val);}, Math.randInt(1000));}
:
<script>
var a = function randomInteger(max) {
var rand = 0 + Math.random() * (max + 1 - 0 -1);
rand = Math.floor(rand);
return rand;
};
function callback(dd) {
var caaler = 20 + dd;
return caaler;
};
var hh = callback(20)
var q = a(50);
var g = request(q,hh);
function request(val, callback) {
setTimeout(function() {
callback(val * val);
}, 3000);
}
console.log(callback(56));
</script>
但是,我对您的数据结构非常怀疑。我希望NOT EXISTS
能够获得班级和学生的链接:
SELECT m.student_id, m.class_id
FROM class_memberships m
WHERE m.class_id = 12 AND
NOT EXISTS (SELECT 1
FROM grades g
WHERE g.student_id = m.student_id AND gr.grade_type = 18
);
但是,我可能会误解数据结构。
答案 4 :(得分:0)
这打破了它
其中mem.class_id = 12且gr.grade_type = 18
为什么要两次加入同一张桌子?
SELECT mem.student_id, mem.class_id
FROM class_memberships as mem
left join grades as gr
on mem.student_id = gr.student_id
and gr.grade_type = 18
where gr.student_id is null
and mem.class_id = 12