본문 바로가기

SQL/LeetCode

LeetCode / 1280. Students and Examinations / MySQL(Easy)

728x90

📚문제

출처 : LeetCode(https://leetcode.com/problems/students-and-examinations/)


📝풀이

# Write your MySQL query statement below
SELECT s.student_id
     , s.student_name
     , j.subject_name
     ,COUNT(e.student_id) AS attended_exams 
FROM Students s 
INNER JOIN Subjects j 
LEFT JOIN Examinations e ON s.student_id = e.student_id 
                         AND j.subject_name = e.subject_name 
GROUP BY s.student_id,s.student_name,j.subject_name 
ORDER BY s.student_id,j.subject_name

 

테이블 3개를 어떻게 조인해주어야하는지 고민을 많이했다

Examination테이블에 기본키와 외래키가 있으니

나머지 테이블을 Inner Join,Left join...해주어봤는데 

문제 예시처럼 나오지가 않았다

 

그래서 참고한 방법 중 핵심은

 

1. CROSS JOIN(=교차 결합)

모든 id,이름,과목 각각에 대해서 전개하려면 

Students 테이블과 Subjects 테이블을

곱집합 형태처럼 교차결합(Cross Join) 해주어야한다

두 테이블을 그냥 JOIN(=Inner JOIN)해주면

결합조건이 따로 없기 때문에 교차결합(Cross Join)한 것과 같은 결과값을 반환한다

 

이후에는 시험을 보지 않더라도 ID가 나와야하므로 

Students 테이블을 기준으로 LEFT JOIN 해주면 된다

 

그리고 한 가지 유의할 점은 결합조건에서 

subject_name 컬럼이 동일하다는 조건을 부여해야한다

그렇지 않으면 

id 기준으로 LEFT Join해주었기 때문에

이런식으로 student_id, subject_name에 대해

해당 id가 본 시험 과목이름이 다 출력된다

 

그리고 직접적으로 JOIN해주는 테이블끼리가 아니더라도 결합조건을 걸어줄 수 있다는 것을 알았다

 

2. COUNT(열 이름)

이건 개인적으로 헷갈리지 않고 다시 리마인드하기 위해서 적어봤다

만약 해당 학생이 시험을 보지 않았다면 어떻게 카운트를 해주지 ? 에 대해서

CASE 문을 사용해봤다

COUNT(CASE WHEN e.student_id IS NOT NULL THEN 1 ELSE 0 END ) AS attended_exam

 

근데 이렇게 해주면 0도 카운트로 세서 시험을 보지 않은 경우도 1이 되버린다

 

그래서 간단하게

COUNT(e.studetnt_id)

 

해주게 되면 NULL값은 포함하지 않고 계산하기 때문에 

0이 나오게된다

728x90