SELECT i.NAME, i.DATETIME
FROM ANIMAL_INS as i left join ANIMAL_OUTS as o USING(ANIMAL_ID)
WHERE 1=1
AND o.ANIMAL_ID is NULL
order by 2
limit 3
ANIMAL_ID, ANIMAL_TYPE, DATETIME, NAME, SEX_UPON_OUTCOME는 각각 동물의 아이디, 생물 종, 입양일, 이름, 성별 및 중성화 여부를 나타낸다. ANIMAL_OUTS 테이블의 ANIMAL_ID는 ANIMAL_INS의 ANIMAL_ID의 외래 키이다.
문제
아직 입양을 못 간 동물 중, 가장 오래 보호소에 있었던 동물 3마리의 이름과 보호 시작일을 조회하는 SQL문을 작성후 결과는 보호 시작일 순으로 조회
조심해야 할 부분은 보호소에 오래 있었던 부분이라는 점과 아직 보호소에서 안나갔다는 점이다.테이블 하나는 들어오는데이터고 다른 하나는 나가는 데이터 이다.
오래있었다면 당연히 들어온 날짜가 오래 되었다는 의미이므로 조인 이후 조회할 날짜데이터는 ANIMAL_INS 테이블의 데이터 일 것이다.
또한 나가지 않았다면 ANIMAL_OUTS 테이블에 없어야 한다는 점이다.
이럴때는 left join으로 INS쪽으로 조인되게 쿼리를 짜 주어야 한다. INS에 있는데이터 + INS에 있으면서 OUT에 있는 데이터를 뽑아준다.
그러면 들어왔고 나간 동물, 들어왔지만 나간 동물을 뽑아낸다.
OUT에만 있는 데이터는 어차피 없겠지만 이렇게 뽑아서 OUT기준으로 나오는 데이터가 NULL일 경우 해당 데이터는 IN에는 있지만 OUT 겹치는 부분에는 없는 데이터가 되게된다. 따라서 유니크한 값인 ANIMAL_ID 컬럼을 사용하여 o.ANIMAL_ID is NULL 조건을 추가하여 파란 부분의 값을 추출해 들어온 날짜 테이블 기준으로 오름차순(숫자가 낮을수록 오래된 날짜이기에) limit 3 을 걸어 상위 3개값을 구하여 해결한다.
막상 쿼리 짤때는 파바박 되었는데 설명하려니까 엄청 길어져서 당황스러운 쿼리인것 같다.
'SQL > MY SQL 문제 풀이(프로그래머스)' 카테고리의 다른 글
[MYSQL] PROGRAMMERS_있었는데요 없었습니다 (0) | 2024.02.22 |
---|---|
[MYSQL] PROGRAMMERS_조건별로 분류하여 주문상태 출력하기 (0) | 2024.02.22 |
[MYSQL] PROGRAMMERS_카테고리 별 도서 판매량 집계하기 (0) | 2024.02.22 |
[MYSQL] PROGRAMMERS_루시와 엘라 찾기 (0) | 2024.02.22 |
[MYSQL] PROGRAMMERS_최솟값 구하기 (0) | 2024.02.22 |