오랜 기간 보호한 동물(1) & 오랜 기간 보호한 동물(2)

는는·2023년 2월 7일
0

SQL - 문제 풀이

목록 보기
25/77

오랜 기간 보호한 동물(1)

https://school.programmers.co.kr/learn/courses/30/lessons/59044

동물 시작일이 들어 있는 animal_ins 테이블과 동물의 입양일 데이터가 들어있는 animal_outs 테이블을 JOIN으로 합쳐줘야하는데요

아직 입양을 못 간 동물의 데이터를 조회해야하기 때문에 OUTER JOIN으로 합쳐줘야합니다.

보호 시작일 데이터가 있는 테이블을 A로 하고 LEFT JOIN으로 합쳐줍니다.

SELECT *
FROM animal_ins A LEFT join animal_outs B USING (animal_id)

WHERE절에서 null 을 이용해 입양일 데이터가 없는 이름과, 보호 시작일 데이터를 불러옵니다. 여기서 중요한 것은 어느 테이블의 이름을 가져오는지 입니다.
left join으로 A 테이블 기준으로 가져왔기 때문에 A테이블의 이름을 가져와야합니다. B 테이블의 이름을 가져오면, null 값으로 값이 없습니다.
datetime는 보호 시작일 데이터를 가져와야해서 A테이블에서 가져왔습니다.

SELECT A.name,A.datetime
FROM animal_ins A LEFT join animal_outs B USING (animal_id)
WHERE B.datetime is null

이제 보호 시작일 오름차순으로 정렬해주고, 3가지의 데이터만 출력하면 정답입니다.

ORDER BY A.datetime
LIMIT 3

정답

SELECT A.name,A.datetime
FROM animal_ins A LEFT join animal_outs B USING (animal_id)
WHERE B.datetime is null
ORDER BY A.datetime
LIMIT 3

오랜 기간 보호한 동물(2)

https://school.programmers.co.kr/learn/courses/30/lessons/59411

두 테이블을 합쳐줘야하는데요 입양간 동물의 정보만 가져와야하기에,

inner join으로 합쳐주고 지정된 칼럼을 불러옵니다.

SELECT animal_id, B.name
FROM animal_ins A join animal_outs B USING (animal_id)

이제 보호기간이 긴 순으로 조회해야하는데요,

DATEDIFF로 입양일 - 보호시작일을 빼주고, 그 데이터 기준 날짜를 내림차순 정렬, 상위 2마리의 데이터만 불러오면 정답입니다.

ORDER BY DATEDIFF(B.datetime, A.datetime) DESC
LIMIT 2

정답

SELECT animal_id, B.name
FROM animal_ins A join animal_outs B USING (animal_id)
ORDER BY DATEDIFF(B.datetime, A.datetime) DESC
LIMIT 2

0개의 댓글