LeetCode 1280. 学生们参加各科测试的次数

题目链接:1280. 学生们参加各科测试的次数

题目描述

学生表:Students

Column NameType
student_idint
student_namevarchar

在 SQL 中,主键为 student_id(学生ID),该表内的每一行都记录有学校一名学生的信息。

科目表: Subjects

Column NameType
subject_namevarchar

在 SQL 中,主键为 subject_name(科目名称),每一行记录学校的一门科目名称。

考试表: Examinations

Column NameType
student_idint
subject_namevarchar

这个表可能包含重复数据(换句话说,在 SQL 中,这个表没有主键)。 学生表里的一个学生修读科目表里的每一门科目。
这张考试表的每一行记录就表示学生表里的某个学生参加了一次科目表里某门科目的测试。

查询出每个学生参加每一门科目测试的次数,结果按 student_idsubject_name 排序。

查询结构格式如下所示。
输入:
Students table:

student_idstudent_name
1Alice
2Bob
13John
6Alex

Subjects table:

subject_name
Math
Physics
Programming

Examinations table:

student_idsubject_name
1Math
1Physics
1Programming
2Programming
1Physics
1Math
13Math
13Programming
13Physics
2Math
1Math

输出:

student_idstudent_namesubject_nameattended_exams
1AliceMath3
1AlicePhysics2
1AliceProgramming1
2BobMath1
2BobPhysics0
2BobProgramming1
6AlexMath0
6AlexPhysics0
6AlexProgramming0
13JohnMath1
13JohnPhysics1
13JohnProgramming1

解释:

结果表需包含所有学生和所有科目(即便测试次数为0):
Alice 参加了 3 次数学测试, 2 次物理测试,以及 1 次编程测试;
Bob 参加了 1 次数学测试, 1 次编程测试,没有参加物理测试;
Alex 啥测试都没参加;
John 参加了数学、物理、编程测试各 1 次。

题目分析

先将学生表和科目表笛卡尔积组成结果左半部分,再把考试表分组统计后链接在结果里。理论可行,开始百度。

SELECT *
FROM Students AS st,
     Subjects AS su
ORDER BY st.student_id, su.subject_name

在这里插入图片描述
看起来效果很好,接下来把考试表分组并按学生ID和科目名称为条件链接在现有结果上,提交。

代码

SELECT st.*, su.*, COUNT(ex.subject_name) AS attended_exams
FROM Students AS st
         CROSS JOIN Subjects AS su
         LEFT JOIN Examinations AS ex ON ex.student_id = st.student_id AND ex.subject_name = su.subject_name
GROUP BY st.student_id, su.subject_name
ORDER BY st.student_id, su.subject_name

今天没问海螺,又是认真学习的一天🏫

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值