🤔 문제
다음은 중고거래 게시판 정보를 담은 `USED_GOODS_BOARD` 테이블과 중고거래 게시판 첨부 파일 정보를 담은 `USED_GOODS_REPLY`입니다.
`USED_GOODS_BOARD` 테이블은 다음과 같으며 `BOARD_ID`, `WRITER_ID`, `TITLE`, `CONTENTS`, `PRICE`, `CREATED_DATE`, `STATUS`, `VIEWS`은 게시글 ID, 작성자 ID, 게시글 제목, 게시글 내용, 가격, 작성일, 거래상태, 조회수를 의미합니다.
`USED_GOODS_REPLY` 테이블은 다음과 같으며 `REPLY_ID`, `BOARD_ID`, `WRITER_ID`, `CONTENTS`, `CREATED_DATE`는 각각 댓글ID, 게시글ID, 작성자ID, 댓글내용, 작성일을 의미합니다.
`USED_GOODS_BOARD`와 `USED_GOODS_REPLY` 테이블에서 2022년 10월에 작성된 게시글 제목, 게시글ID, 댓글ID, 댓글 작성자 ID, 댓글 내용, 댓글 작성일을 조회하는 SQL문을 작성해주세요. 결과는 댓글 작성일을 기준으로 오름차순 정렬해주시고, 댓글 작성일이 같다면 게시글 제목을 기준으로 오름차순 정렬해주세요.
예시
`USED_GOODS_BOARD` 테이블이 다음과 같고
`USED_GOODS_REPLY` 테이블이 다음과 같을 때
SQL을 실행하면 다음과 같이 출력되어야 합니다.
💻 나의 풀이
SELECT UGB.TITLE,
UGB.BOARD_ID,
UGR.REPLY_ID,
UGR.WRITER_ID,
UGR.CONTENTS,
DATE_FORMAT(UGR.CREATED_DATE, '%Y-%m-%d') AS CREATED_DATE
FROM USED_GOODS_BOARD UGB
INNER JOIN USED_GOODS_REPLY UGR ON UGB.BOARD_ID=UGR.BOARD_ID
WHERE YEAR(UGB.CREATED_DATE) = 2022
AND MONTH(UGB.CREATED_DATE) = 10
ORDER BY UGR.CREATED_DATE, UGB.TITLE
결과
💡 다른 풀이
1. DATE_FORMAT을 활용한 방법
SELECT TITLE,
BOARD.BOARD_ID,
REPLY_ID,
REPLY.WRITER_ID,
REPLY.CONTENTS,
DATE_FORMAT(REPLY.CREATED_DATE, '%Y-%m-%d') AS CREATED_DATE
FROM USED_GOODS_REPLY AS REPLY
LEFT JOIN USED_GOODS_BOARD AS BOARD
ON REPLY.BOARD_ID=BOARD.BOARD_ID
WHERE DATE_FORMAT(BOARD.CREATED_DATE, '%Y-%m') = '2022-10' -- DATE_FORMAT 을 사용
ORDER BY REPLY.CREATED_DATE, TITLE
2. SUBSTR() 함수를 활용한 방법
SELECT A.TITLE
, A.BOARD_ID
, B.REPLY_ID
, B.WRITER_ID
, B.CONTENTS
, DATE_FORMAT(B.CREATED_DATE, '%Y-%m-%d') AS CRAETED_DATE
FROM USED_GOODS_BOARD AS A
INNER JOIN USED_GOODS_REPLY AS B
ON A.BOARD_ID = B.BOARD_ID
WHERE SUBSTR(A.CREATED_DATE,1,7) = '2022-10' --SUBSTR 사용
ORDER BY B.CREATED_DATE ASC, A.TITLE ASC;
✅ 핵심 정리
문자열 자르기
1) `SUBSTR(문자열, 시작위치, 길이)`
: 대상이 되는 문자열(컬럼)을 시작위치부터 원하는 길이만큼 잘라서 반환한다. (시작위치는 1부터 시작)
SELECT SUBSTR("programmers", 2, 3)
→ rog
2) `RIGHT(문자열, 길이)`
: 대상이 되는 문자열(컬럼)을 맨 오른쪽 끝부터 원하는 길이만큼 잘라서 반환한다.
SELECT RIGHT("programmers", 5)
→ ammers
3) `LEFT(문자열, 길이)`
: 대상이 되는 문자열(컬럼)을 맨 왼쪽 끝부터 원하는 길이만큼 잘라서 반환한다.
SELECT LEFT("programmers", 7)
→ program
🔗 References
[다른 풀이 1]
[다른 풀이 2]
🧘🏻♀️ 느낀점
작년까지만 해도 JOIN 연산을 활용한 문제는 건들지도 못했다.
이제는 JOIN문제를 보면 얼른 풀어보고 싶다는 마음이 든다! 그만큼 성장했다는 뜻? ㅋㅋ
확실히 코딩테스트 공부는 내 풀이를 작성하기 위해 고민하는 것도 중요하지만,
다른 사람들의 풀이를 보면서 '아 이런 방식으로도 풀 수 있구나!'하고 아이디어를 얻어가는 과정이 중요한 것 같다.
그만큼 문제를 풀이하는 시야가 넓어지니까!
'취업준비 > 코딩테스트 문제 풀이' 카테고리의 다른 글
[프로그래머스 SQL 고득점 Kit] SELECT - 과일로 만든 아이스크림 고르기 (0) | 2024.03.28 |
---|---|
[프로그래머스 SQL 고득점 Kit] SELECT - 조건에 맞는 도서 리스트 출력하기 (0) | 2024.03.28 |
[프로그래머스 SQL 고득점 Kit] SELECT - 12세 이하인 여자 환자 목록 출력하기 (1) | 2024.03.28 |
[프로그래머스 SQL 고득점 Kit] SELECT - 평균 일일 대여 요금 구하기 (0) | 2024.03.27 |
[프로그래머스 SQL 고득점 Kit] SELECT - 흉부외과 또는 일반외과 의사 목록 출력하기 (1) | 2024.03.26 |