코딩테스트/SQL 코딩테스트

<프로그래머스> 조회수가 가장 많은 중고거래 게시판 첨부파일 조회하기

배또가또 2023. 12. 28. 18:01

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

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr


  • 문제 요구사항
    • USED_GOODS_BOARD와 USED_GOODS_FILE 테이블에서 가장 조회수가 높은 중고 거래 게시물에 대한
    • 첨부파일 경로를 조회하는 SQL문을 작성
    • 첨부파일 경로는 FILE_ID를 기준으로 내림차순 정렬
    • 파일 결로 양식은 /home/grep/src/이며 게시글 ID를 기준으로 디렉토리를 구분, 파일이름은 파일 ID, 파일 이름, 파일 확장자로 구분되도록 출력
    • 조회수가 가장 높은 게시물은 하나만 존재함

 * 출력예시처럼 "/home/grep/src/게시글ID/파일ID파일이름파일확장자" 이렇게 출력되도록 해야한다. 


우선 두 테이블을 조인한 테이블에서 가장 조회수가 높은 중고 거래 게시물에 대한 게시글ID, 파일ID, 파일 이름, 

파일 확장자를 알아야한다. 

 

가장 조회수가 높은 게시물을 알기 위해서 WHERE절 서브쿼리로 BOARD테이블의 VIEW가 제일 높은 VIEW값을 조회한다. 조회수가 가장 높은 게시물은 단일행이기 때문에 = 연산자로 비교한다. 

 

그리고 해당 조회수를 가지는게시글ID, 파일ID, 파일 이름, 파일 확장자를 조회하는 것을 FROM절 서브쿼리로 작성한다. 

원하는 형태의 양식으로 출력해주기 위해서 CONCAT메소드를 사용했는데 다른 방법이 없을까 찾아보다가 

Double vertical bars || 를 찾아서 Oracle 코드에 사용하기로 했다. (찾았던 블로그에서는 쌍파이프라고 기술하고 있었다)

 

MySQL에서는 ||는 참거짓의 판별 부호로 사용되기 때문에 원래 계획대로 CONCAT을 사용해주었다.


1) Oracle

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

2) MySQL

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

  • 문제를 풀고 블로그에 작성을 하고 있으니 서브쿼리를 너무 남발하고 있는 것은 아닐지에 대해서 고민이 좀 되고 있다. 가능하면 서브쿼리를 필요로 하지 않아 보이는 구문에는 최대한 CTE없이 쿼리를 작성하려는 노력을 앞으로는 하려고한다.