문제
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;