Julia just finished conducting a coding contest, and she needs your help assembling the leaderboard!
Write a query to print the respective hacker_id and name of hackers who achieved full scores for more than one challenge.
두 개 이상의 챌린지 에서 만점을 달성한 해커의 이름 과 hacker_id를 인쇄하는 쿼리를 작성하세요
Order your output in descending order by the total number of challenges in which the hacker earned a full score.
해커가 만점을 획득한 총 챌린지 수를 기준으로 내림차순으로 정렬하세요.
If more than one hacker received full scores in same number of challenges, then sort them by ascending
두 명 이상의 해커가 동일한 수의 챌린지에서 만점을 받은 경우 hacker_id 를 오름차순으로 정렬합니다 .

챌린지의 난이도를 알기 위해서는 SUBMISSIONS와 CHALLENGES 테이블을 조인해야 하고,
난이도별 만점 여부를 알기 위해서는 CHALLENGES와 DIFFICULTY 테이블을 조인해야 하고,
만점자의 이름을 알기 위해서는 SUBMISSONS와 HACKERS 테이블을 조인해야 한다.
SELECT S.HACKER_ID, H.NAME
FROM SUMISSIONS S
JOIN CHALLENGES C ON S.CHALLENGE_ID = C.CHALLENGE_ID
JOIN DIFFICULTY D ON C.DIFFICULTY_LEVEL = D.DIFFICULTY_LEVEL
JOIN HACKERS H ON S.HACKER_ID = H.HACKER_ID
문제에서 주어진 조건 두 개 이상의 챌린지 에서 만점을 달성 / 만점을 획득한 총 챌린지 수를 기준으로 내림차순 / hacker_id 를 오름차순 을 적어준다.
SELECT S.HACKER_ID, H.NAME
FROM SUMISSIONS S
JOIN CHALLENGES C ON S.CHALLENGE_ID = C.CHALLENGE_ID
JOIN DIFFICULTY D ON C.DIFFICULTY_LEVEL = D.DIFFICULTY_LEVEL
JOIN HACKERS H ON S.HACKER_ID = H.HACKER_ID
WHERE S.SCORE = D.SCORE # 만점을 받은 경우
GROUP BY S.HACKER_ID, H.NAME # 두 컬럼이 SELECT절에 있으므로 둘 다 적어준다
HAVING COUNT(SUBMISSION_ID) >= 2 # 두 개 이상의 챌린지
ORDER BY COUNT(SUBMISSION_ID) DESC, S.HACKER_ID ASC # 정렬
여기서 S.SCORE는 HACKER가 받은 점수이고, D.SCORE는 만점의 기준임을 알아야 한다.
SELECT S.HACKER_ID, H.NAME
FROM SUBMISSIONS S
JOIN CHALLENGES C ON S.CHALLENGE_ID = C.CHALLENGE_ID
JOIN DIFFICULTY D ON C.DIFFICULTY_LEVEL = D.DIFFICULTY_LEVEL
JOIN HACKERS H ON S.HACKER_ID = H.HACKER_ID
WHERE S.SCORE = D.SCORE
GROUP BY S.HACKER_ID, H.NAME
HAVING COUNT(*) >= 2
ORDER BY COUNT(*) DESC, S.HACKER_ID ASC
각 테이블을 어떻게 JOIN할 지만 잘 보면 되는 문제였다(고 생각한다..)
여기서 왜 S.SCORE ≥ D.SCORE는 오답 처리가 되는걸까?