-
MySQL) ChallengesSQL 2020. 6. 4. 15:03반응형
Challenges
해도해도 안는다... 어렵고 어렵다.. ㅠㅠ
사이트에서 Join 문제 중에 딱 중간 난이도 문제인데, 어제도 그렇고 오늘도 그렇고 풀지 못했다..
각각 해커가 주최한 대회의 수를 구하고, 최대값인 경우에만 모든 해커 리스트를 보여주고, 최대값이 아닌 경우에는 대회의 수가 겹치면 보여주지 않는 Query를 짜야하는게 문제 조건이다.
어찌어찌 대회수를 구하고 최대값부터 정렬을 해주기는 했으나, 최대값이 아닌 경우 대회 수가 겹칠 때를 제거하지 못했다. 그렇게 40분? 정도가 흐르고 포기했다...
그리고 구글링을 통해 찾은 쿼리문은 깔끔하다고는 할 수 없지만 좋았다.
테이블을 자체적으로 만들어 조인을 하는 방법을 알려준 블로거인데, 오늘도 새로운 도움을 받았다.
조건절에서 테이블을 생성해서 해결하는 방법이었다.
QUERY
SELECT C.hacker_id, H.name, COUNT(C.challenge_id) AS challenges_created FROM Hackers AS H JOIN Challenges AS C ON C.hacker_id = C.hacker_id GROUP BY C.hacker_id, H.name HAVING -- 최대값 challenges_created = (SELECT COUNT(C1.challenge_id) FROM Challenges AS C1 GROUP BY C1.hacker_id ORDER BY COUNT(*) DESC LIMIT 1) OR -- 최대값이 아닌 경우, 값이 중복되는 경우가 없는 애들 challenges_created NOT IN (SELECT COUNT(C2.challenge_id) FROM Challenges AS C2 GROUP BY C2.hacker_id HAVING C2.hacker_id != C.hacker_id) ORDER BY challenges_created DESC, C.hacker_id;
그리고 내가 실패했던 쿼리문..
Failed Query
SELECT H.hacker_id, H.name, M.chs FROM (SELECT HACKERS.hacker_id AS 'hacker_id', COUNT(*) AS 'chs' FROM HACKERS JOIN CHALLENGES ON HACKERS.hacker_id = CHALLENGES.hacker_id GROUP BY HACKERS.hacker_id) AS M, JOIN HACKERS AS H ON H.hacker_id = M.hacker_id GROUP BY M.chs,H.hacker_id,H.name HAVING M.chs = Max(M.chs) ORDER BY M.chs desc, H.hacker_id;
이 쿼리는 당연히 틀린 쿼리이다. 챌린지 수에 따라 빼주는 문장이 없으니..
앞서 만들었던 테이블을 이용해서 챌린지 수에 따라 빼주는 조건을 달아주려 했으나, 테이블을 찾을 수 없다고 나왔다. 그렇다, 저번에 테이블을 만들어 Join을 걸어주는 것으로 이해한게 잘못된 것이다. 테이블을 만들어서 JOIN을 걸어준 게 아니고, 출력으로 나온 것에 JOIN을 시켰던 것이다. 그러니 테이블을 불러오는 FROM에는 생성된 것을 불러올 수 없는 것이다. 그걸 알고 위에 쿼리를 작성한 사람도 조건 절에서 해결한 것 같다..
기억에 남길 것
1. 테이블을 새롭게 만들어 SELF JOIN을 한다고 이해했던 것은 잘못되었다. 쿼리 조건에 따라 결과가 생성되고, 그 변수를 이용할 수 있는 것이다. 따라서, SELECT FROM WHERE 등 구절에서 FROM 절에서는 이용할 수 없다는 뜻이다.
2. <> 와 != 는 같은 표현이다.
반응형'SQL' 카테고리의 다른 글
MySQL 권한 설정 (0) 2021.04.29 프로그래머스) [SQL 고득점 KIT, JOIN] 없어진 기록 찾기, 있었는데요 없었습니다, 오랜 기간 보호한 동물(1), 보호소에서 중성화한 동물 (0) 2020.06.04 프로그래머스) [SQL 고득점 KIT] 입양 시각 구하기, 중성화여부, 오랜기간 보호한 동물(2), DATETIME에서 DATE로 변환, NULL 처리하기 (0) 2020.06.04 MySQL) Ollivander's Inventory (0) 2020.06.03 MySQL) Top Competitors (0) 2020.06.03