解题思路:
根据题意要实现每个学生参加每个科目考试的次数,如果没有参加,则统计次数为0
首先将学生表和科目表进行笛卡尔积。
对考试表Examinations表统计学生参加考试的次数,按照学生id和考试科目进行分组,使用count函数统计次数,起别名为grouped表
之后将学生表和科目表的笛卡尔积与grouped表进行左外连接(这样保证在学生id不在考试表中的学生也可以被统计上),连接条件为学生id和科目,结果按照学生id,姓名,科目,进行分组。
SQL代码:
SELECT
s.student_id, s.student_name, sub.subject_name, IFNULL(grouped.attended_exams, 0) AS attended_exams
FROM
Students s
CROSS JOIN
Subjects sub
LEFT JOIN (
SELECT student_id, subject_name, COUNT(*) AS attended_exams
FROM Examinations
GROUP BY student_id, subject_name
) grouped
ON s.student_id = grouped.student_id AND sub.subject_name = grouped.subject_name
ORDER BY s.student_id, s.student_name,sub.subject_name;
题解:官方题解