1. 程式人生 > 實用技巧 >mysql leetcode 1280. 學生們參加各科測試的次數 解題思路 一步一步來

mysql leetcode 1280. 學生們參加各科測試的次數 解題思路 一步一步來

題目

解題思路

先看題目,再看結果
從結果可以看出
結果的前三列列為表students和subjects的交叉連線,也就是笛卡爾積
而最後一列為每個學生參加每個學科的測試次數,也就是分組統計

解題步驟
1.求笛卡爾積

select
*
from `Students` as s1 
cross join `Subjects` as s2

2.分組統計

select
student_id, 
subject_name,
count(student_id) as attended_exams
from `Examinations`
group by student_id,subject_name

3.將兩部連線起來,以第一部分為準,也就是左連線
然後沒考試的,也就是測試次數為0,使用ifnull判斷設0

select
ss.student_id as student_id,
ss.student_name as student_name,
ss.subject_name as subject_name,
ifnull(e1.attended_exams, 0) as attended_exams
from
(
    select
    *
    from `Students` as s1 
    cross join `Subjects` as s2
) as ss
left join
( select student_id, subject_name, count(student_id) as attended_exams from `Examinations` group by student_id,subject_name ) as e1 on ss.student_id = e1.student_id and ss.subject_name = e1.subject_name order by ss.student_id, ss.subject_name