mysql 문제풀이/easy

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

gooreumsea 2023. 7. 19. 01:52

습득한점:

 

조회수의 최대값을 찾아야 할 때, 나는 당연히 최대값을 찾고, BOARD_ID를 MAX(VIEW) 를 SELECT 문에 함께 붙이면,
RDBMS이기에 자동으로 조회수가 최대값인 로우의 BOARD_ID를 뽑아낼 수 있을 줄 알았지만 아니었다.

그렇게 친절하지는 않은 듯 하다.

 

MAXVIEW는 MAXVIEW대로나오고,1줄짜리 row이니,

나머지 데이터들은 전체데이터의 첫번째열을 반환하는 것 같았다.

 

mysql의 새로운 특성을 파악했다.

 

SQL은 그렇게 친절하지 않았다.

 

 

 

문제:

USED_GOODS_BOARD와 USED_GOODS_FILE 테이블에서

조회수가 가장 높은 중고거래 게시물에 대한 첨부파일 경로를 조회하는 쿼리 작성.

 

첨부파일 경로는 FILE ID를 기준으로 내림차순 정렬

기본적인 파일경로는 /home/grep/src/ 이며, 게시글 ID를 기준으로 디렉토리가 구분되고,

파일이름은 파일 ID, 파일 이름, 파일 확장자로 구성되도록 출력

* 조회수가 가장 높은 게시물은 하나만 존재

 

 

문제파악:

게시물 서두에서 mysql의 새로운 특성을 파악했기에,

BOARD 테이블에서 VIEW의 최댓값만을 찾은 뒤,

이를 다시 BOARD 테이블에 WHERE조건으로 넣고 이에 해당하는 BOARD_ID를 찾으면 된다.

즉 서브쿼리를 겹겹으로 사용하면 된다.

 

또 이 문제에서는 새롭게, 컬럼의 내용을 이어붙여야 하는 조건이 있었다.

CONCAT(A, B, C) 이런식으로 필요한 컬럼을 이어 붙였다.

컬럼 외에 기재가 필요한 문자열의 경우 '' 혹은 ' 로 반드시 감싸줘야 한다.

 

DB언어 외에도 JAVA던 Python이던 마찬가지이다.

보통 문법적으로 의미를 가지는 경우에는 ' ' 를 활용하고

이외 별 의미가 없는 일반 문자열은 " "를 사용하면 된다.

 

사실 두개 중 어떤 것을 쓰던 상관이 없는데, 회사에 입사하면 개발자들끼리 관습적으로 정해놓는 룰이 있다.

이에 맞춰서, 혹은 혼자서만 사용한다면 개인 취향껏 사용하면 된다.

 

그 외는 문제가 시키는 데로 하면 된다.

 

 

풀이:

SELECT CONCAT('/home/grep/src/', BOARD_ID, '/', FILE_ID, FILE_NAME, FILE_EXT) AS FILE_PATH
FROM USED_GOODS_FILE
WHERE BOARD_ID = (

                SELECT BOARD_ID
                FROM USED_GOODS_BOARD
                WHERE VIEWS = (
                                WITH MAX_VIEWS AS (
                                     SELECT MAX(VIEWS) AS VIEW
                                     FROM USED_GOODS_BOARD   
                                                  )
                                SELECT *
                                FROM MAX_VIEWS   
                                )
                  )
ORDER BY FILE_ID DESC

 

*** WHERE 조건에 들어가는 WITH 문 대신에,

    SELECT MAX(VIEWS) FROM USED_GOODS_BOARD를 사용해도 된다.