我的数据库中有3个表。
一个用于活动,另一个用于学生,最后一个用于学生在活动中的得分。因此,一个活动可以有一个或多个学生的分数,一个学生在一个活动中有一个分数。
所以我需要显示学生课程的活动清单,即使他还没有得分。但是,如果学生在某些活动中得分,我必须只显示该学生的分数。
我的问题是,当我选择学生的分数时,我需要添加一个'where'条件来仅选择他的分数,但如果他还没有分数,我的结果中没有记录。如何选择课程的所有活动,并且只有学生有分数,然后才选择他的分数?
活动表:
id | name | score
1 | first exam | 30
2 | second exam | 30
3 | final exam | 40
学生表:
id | name
1 | Jhon
2 | Sam
3 | Frank
学生成绩表:
id | activity | student | score
1 | 1 | 1 | 16
2 | 1 | 2 | 17
3 | 1 | 3 | 15
所以,如果Jhon进入系统并希望看到活动的过程,他应该看到所有活动的列表,但只有他的分数。例如这个列表:
Activity | Score | Your Score
First Exam | 30 | 16
Second Exam | 30 | -
Final Exam | 40 | -
答案 0 :(得分:0)
您想要一个左外连接:
select a.activity_id, coalesce(acs.score, 0) as thescore
from activities a left outer join
activityscores acs
on a.activity_id = acs.activity_id and
acs.student_id = THESTUDENTID;
如果学生在某项活动中可以获得多个分数,那么您也需要聚合。