습득한점:
조회수의 최대값을 찾아야 할 때, 나는 당연히 최대값을 찾고, BOARD_ID를 MAX(VIEW) 를 SELECT 문에 함께 붙이면,
RDBMS이기에 자동으로 조회수가 최대값인 로우의 BOARD_ID를 뽑아낼 수 있을 줄 알았지만 아니었다.
그렇게 친절하지는 않은 듯 하다.
MAXVIEW는 MAXVIEW대로나오고,1줄짜리 row이니,
나머지 데이터들은 전체데이터의 첫번째열을 반환하는 것 같았다.
mysql의 새로운 특성을 파악했다.
문제:
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를 사용해도 된다.
'sql > easy' 카테고리의 다른 글
프로그래머스 Lv 4 - 보호소에서 중성화한 동물 (Lv 4 문제 마지막) (0) | 2023.08.16 |
---|---|
프로그래머스 Lv 4 - 식품분류별 가장 비싼 식품의 정보 조회하기 (0) | 2023.08.16 |
프로그래머스 Lv 4 - 5월 식품들의 총매출 조회하기 (0) | 2023.07.18 |
프로그래머스 Lv 4 - 서울에 위치한 식당 목록 출력하기 (0) | 2023.07.14 |
프로그래머스 Lv 4 - 년, 월, 성별 별 상품 구매 회원 수 구하기 (0) | 2023.07.14 |