[SQL] 프로그래머스 : 조회수가 가장 많은 중고거래 게시판의 첨부파일 조회하기

문제

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

 

프로그래머스

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

programmers.co.kr


✍️ 문제 요약

  • USED_GOODS_BOARD와 USED_GOODS_FILE 테이블에서
    조회수가 가장 높은 중고거래 게시물에 대한 첨부파일 경로를 조회하는 SQL문을 작성
  • 첨부파일 경로 형식:
    /home/grep/src/게시글ID/파일ID파일이름파일확장자
  • 첨부파일 경로는 FILE ID를 기준으로 내림차순 정렬
  • 조회수가 가장 높은 게시물은 하나만 존재

내가 작성한 코드

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

코드 설명

1. 조회수가 가장 높은 게시글 찾기

SELECT BOARD_ID
FROM USED_GOODS_BOARD
WHERE VIEWS = (SELECT MAX(VIEWS) FROM USED_GOODS_BOARD)

2. 해당 게시글의 첨부파일 가져오기

FROM USED_GOODS_FILE F
JOIN ( ... ) I ON F.BOARD_ID = I.BOARD_ID

3. 파일 경로 가공하기

SELECT CONCAT('/home/grep/src/'
       		, F.BOARD_ID
                , '/'
                , F.FILE_ID
                , F.FILE_NAME
                , F.FILE_EXT) AS FILE_PATH

4. 파일 ID 기준 내림차순 정렬

ORDER BY F.FILE_ID DESC

개선점

1) 하위 쿼리 제거 → 단일 쿼리로

  • 조회수 1등 게시글은 하나뿐 → 굳이 JOIN 쓸 필요 없이 WHERE 절로 바로 조회

2) MAX(VIEWS) → ORDER BY + LIMIT 1 (MySQL)

  • MAX(VIEWS)는 동일 조회수 게시글이 복수일 경우 모두 출력될 위험
  • ORDER BY VIEWS DESC LIMIT 1로 정확히 하나만 추출 ('조회수가 가장 높은 게시물은 하나만 존재'라 문제 조건 충족)

3) FILE_PATH 문자열 조합 → CONCAT_WS 사용 (MySQL)

  • CONCAT_WS('/', …)는 자동으로 '/' (슬래시) 구분자를 넣어줌
# CONCAT_WS('구분자', a, b, c, ...)

CONCAT_WS('/', '/home/grep/src', BOARD_ID, CONCAT(FILE_ID, FILE_NAME, FILE_EXT))

개선된 코드

SELECT CONCAT_WS('/', '/home/grep/src', F.BOARD_ID, CONCAT(F.FILE_ID, F.FILE_NAME, F.FILE_EXT)) AS FILE_PATH
FROM USED_GOODS_FILE F
WHERE F.BOARD_ID = (
    SELECT BOARD_ID
    FROM USED_GOODS_BOARD
    ORDER BY VIEWS DESC
    LIMIT 1
)
ORDER BY F.FILE_ID DESC;