취업준비/코딩테스트 문제 풀이

[프로그래머스 SQL 코딩테스트 연습] Lv3. 조회수가 가장 많은 중고거래 게시판의 첨부파일 조회하기(MySQL)

상급닌자연습생 2024. 7. 30. 22:56

🤔 문제

다음은 중고거래 게시판 정보를 담은 `USED_GOODS_BOARD` 테이블과 중고거래 게시판 첨부파일 정보를 담은 `USED_GOODS_FILE` 테이블입니다. `USED_GOODS_BOARD` 테이블은 다음과 같으며 `BOARD_ID`, `WRITER_ID`, `TITLE`, `CONTENTS`, `PRICE`, `CREATED_DATE`, `STATUS`, `VIEWS`은 게시글 ID, 작성자 ID, 게시글 제목, 게시글 내용, 가격, 작성일, 거래상태, 조회수를 의미합니다.

 

`USED_GOODS_FILE` 테이블은 다음과 같으며 `FILE_ID`, `FILE_EXT`, `FILE_NAME`, `BOARD_ID`는 각각 파일 ID, 파일 확장자, 파일 이름, 게시글 ID를 의미합니다.

 

`USED_GOODS_BOARD`와 `USED_GOODS_FILE` 테이블에서 조회수가 가장 높은 중고거래 게시물에 대한 첨부파일 경로를 조회하는 SQL문을 작성해주세요. 첨부파일 경로는 `FILE_ID`를 기준으로 내림차순 정렬해주세요. 기본적인 파일경로는 `/home/grep/src/` 이며, 게시글 ID를 기준으로 디렉토리가 구분되고, 파일이름은 파일 ID, 파일 이름, 파일 확장자로 구성되도록 출력해주세요. 조회수가 가장 높은 게시물은 하나만 존재합니다.

 

예시

`USED_GOODS_BOARD` 테이블이 다음과 같고

 

`USED_GOODS_FILE` 테이블이 다음과 같을 때

 

SQL을 실행하면 다음과 같이 출력되어야 합니다.

 

 

 

 

 

 

 

 


💻 나의 풀이

WITH MAXVIEW AS(
    SELECT BOARD_ID, VIEWS
    FROM USED_GOODS_BOARD
    ORDER BY 2 DESC
    LIMIT 1
)
SELECT CONCAT('/home/grep/src/', m.BOARD_ID, '/', f.FILE_ID, f.FILE_NAME, f.FILE_EXT) AS FILE_PATH
FROM USED_GOODS_FILE f
JOIN MAXVIEW m ON f.BOARD_ID=m.BOARD_ID
ORDER BY f.FILE_ID DESC;

 

 

 

 

결과

 

 

 

 

 

 

 


💡 다른 풀이

1. WHERE절 안에 서브쿼리로 최대 조회수를 참조하는 풀이

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

 

 

 

처음에 아래와 같이 작성했었는데 에러가 났었다.

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

 

이유는 다음과 같다.

 

`WHERE (BOARD_ID, VIEWS) IN (SELECT BOARD_ID, MAX(VIEWS) FROM USED_GOODS_BOARD)`는 `BOARD_ID`와 `VIEWS`를 동시에 비교하지만, `MAX(VIEWS)`만 선택하기 때문에 잘못된 비교이다. `BOARD_ID`는 고유해야 하며, `MAX(VIEWS)`는 그룹화 없이 사용되어야 한다.