Data Story

데이터 사이언스, 쉽게 설명하기

Coding Test/SQL

조회수가 가장 높은 게시글의 첨부파일 경로 구하기 (SQL 문제 풀이)

_data 2025. 4. 13. 11:26

SQL 문제를 풀다가 꽤 흥미로운 상황을 만났다.
단순히 JOIN하고 ORDER BY만 하면 끝나는 문제인 줄 알았는데,
막상 풀다 보니 출력 형식이 조금 까다롭다.
이런 게 코딩 테스트나 실무에서도 자주 헷갈릴 수 있겠다 싶어서 정리해두려고 한다.


문제 이해하기

사용하는 테이블은 두 개다.

  1. USED_GOODS_BOARD – 중고거래 게시글 데이터
  2. USED_GOODS_FILE – 게시글에 첨부된 파일 정보

USED_GOODS_BOARD

컬럼명타입설명
BOARD_ID VARCHAR(5) 게시글 ID
WRITER_ID VARCHAR(50) 작성자 ID
TITLE VARCHAR(100) 게시글 제목
CONTENTS VARCHAR(1000) 게시글 내용
PRICE NUMBER 가격
CREATED_DATE DATE 작성일
STATUS VARCHAR(10) 거래 상태
VIEWS NUMBER 조회수

USED_GOODS_FILE

컬럼명타입설명
FILE_ID VARCHAR(10) 파일 ID
FILE_EXT VARCHAR(5) 파일 확장자
FILE_NAME VARCHAR(256) 파일 이름
BOARD_ID VARCHAR(10) 게시글 ID

문제 조건

  • 조회수가 가장 높은 게시글 1개만 찾기
  • 해당 게시글에 첨부된 모든 파일 경로를 출력해야 함
  • 경로 형식은 다음과 같아야 한다:
/home/grep/src/{BOARD_ID}/{FILE_ID}{FILE_NAME}.{FILE_EXT}
  • 정렬 기준: FILE_ID 기준 내림차순

중간에 좀 헷갈렸던 포인트

처음엔 "조회수 높은 게시글 하나니까, 결과도 한 줄 나오겠지?"라고 생각했다.
근데 막상 조인해서 출력해보니까 여러 줄이 나왔다.
순간 “어 뭐지? 중복?” 이런 생각이 들었는데...

곰곰이 생각해보니,
게시글은 하나여도 첨부파일이 여러 개일 수 있다는 것을 간과했다.
즉, 조회수 기준으로 게시글 하나만 고르고,
그 글에 연결된 파일들을 다 불러오는 게 맞는 방향이었다.

이런 디테일을 놓치면 엉뚱한 방향으로 SQL을 짜게 된다.


최종 SQL (MySQL)

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
  ORDER BY VIEWS DESC
  LIMIT 1
) b ON f.BOARD_ID = b.BOARD_ID
ORDER BY f.FILE_ID DESC;

출력

FILE_PATH
/home/grep/src/B0008/MOV_000008photo1.avi
/home/grep/src/B0008/IMG_000011photo.png

✍️ 마무리 정리

- String 결합은 SELECT 절에서 'CONCAT'으로 한다.

- JOIN에서 SQL Syntax 적는 거는 쉽게 되어야 한다.