MYSQL/프로그래머스 LV03

조회수가 가장 많은 중고거래 게시판의 첨부파일 조회하기

수스리 2025. 3. 4. 23:22

https://school.programmers.co.kr/learn/courses/30/lessons/164671

 

프로그래머스

SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프

programmers.co.kr

WITH TEMP AS(
SELECT
BOARD_ID,
RANK() OVER(ORDER BY VIEWS DESC) AS ranking
FROM
USED_GOODS_BOARD
)
SELECT
CONCAT("/home/grep/src/", BOARD.BOARD_ID , '/',FILE_ID, FILE_NAME, FILE_EXT) AS FILE_PATH
FROM USED_GOODS_BOARD BOARD
JOIN USED_GOODS_FILE FILE ON BOARD.BOARD_ID = FILE.BOARD_ID
JOIN TEMP ON BOARD.BOARD_ID = TEMP.BOARD_ID
WHERE TEMP.ranking = 1
ORDER BY FILE_ID DESC

우선 이 코드에서는 막히는 부분이 있었다. 위 코드는 내가 수정한 부분이다. 아래는 내가 오답으로 제출한 코드이다.

WITH TEMP AS(
    SELECT
        BOARD_ID,
        RANK() OVER(ORDER BY VIEWS DESC) AS ranking
    FROM
        USED_GOODS_BOARD
)
SELECT 
    CONCAT("/home/grep/src/", BOARD.BOARD_ID , '/',FILE_ID, FILE_NAME, FILE_EXT) AS FILE_PATH, VIEWS
FROM USED_GOODS_BOARD BOARD
JOIN USED_GOODS_FILE FILE ON BOARD.BOARD_ID = FILE.BOARD_ID
JOIN TEMP ON BOARD.BOARD_ID = TEMP.BOARD_ID
WHERE TEMP.ranking = 1
ORDER BY FILE_ID DESC
LIMIT 1;

우선 LIMIT 1을 주목해주자. LIMIT1을 하면 조회수가 같은 행을 뽑을 때 문제가 발 생할 수 있다. 공동 1등이란 게 괜히 있는게 아니지 않는가?

다른 방식으로 서브쿼리로도 풀 수 있다

SELECT CONCAT("/home/grep/src/", BOARD.BOARD_ID , '/',FILE_ID, FILE_NAME, FILE_EXT) AS FILE_PATH
FROM USED_GOODS_BOARD BOARD
JOIN USED_GOODS_FILE FILE ON BOARD.BOARD_ID = FILE.BOARD_ID
WHERE VIEWS = (
    SELECT
        MAX(VIEWS)
    FROM 
        USED_GOODS_BOARD
)
ORDER BY FILE_ID DESC;

매우 간단한 서브쿼리이긴 하다. 요즘에 서브쿼리로는 문제를 많이 못풀었는데 다음엔는 서브쿼리로도 문제를 한번 풀어봐야겠다.