SQL 문제를 풀다가 꽤 흥미로운 상황을 만났다.
단순히 JOIN하고 ORDER BY만 하면 끝나는 문제인 줄 알았는데,
막상 풀다 보니 출력 형식이 조금 까다롭다.
이런 게 코딩 테스트나 실무에서도 자주 헷갈릴 수 있겠다 싶어서 정리해두려고 한다.
문제 이해하기
사용하는 테이블은 두 개다.
- USED_GOODS_BOARD – 중고거래 게시글 데이터
- 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 적는 거는 쉽게 되어야 한다.
'Coding Test > SQL' 카테고리의 다른 글
보호 기간이 가장 길었던 동물 (SQL 문제 풀이) (0) | 2025.04.15 |
---|---|
부서별 평균 연봉 구하기 (SQL 문제 풀이) (0) | 2025.04.14 |
프로그래머스 SQL Lv.3 [대여 횟수가 많은 자동차들의 월별 대여 횟수 구하기] (0) | 2023.02.24 |
프로그래머스 SQL Lv.4 [자동차 대여 기록 별 대여 금액 구하기] (0) | 2023.02.22 |
프로그래머스SQL Lv.3 [자동차 대여 기록에서 대여중 / 대여 가능 여부 구분하기] (0) | 2023.02.17 |