본문 바로가기
문제풀이/SQL(My sql)

[문제풀이] 오랜 기간 보호한 동물(2)-datediff

by kime2 2024. 1. 5.
출처

 

문제

입양을 간 동물 중, 보호 기간이 가장 길었던 동물 두 마리의 아이디와 이름을 조회하는 SQL문을 작성해주세요. 

이때 결과는 보호 기간이 순으로 조회해야 합니다.

 

문제에 대한 해석

입양을 간 동물 중 보호기간이 가장 길었던 동물 두마리

 

풀이(MYSQL)

with temp as (
select outs.animal_id, outs.name, datediff(outs.datetime,ins.datetime) dates
from animal_outs outs left join animal_ins ins on outs.animal_id = ins.animal_id
where ins.animal_id is not null
    )
    select animal_id, name
    from temp
    order by dates desc
    limit 2

 

작동순서

💡SQL 실행 순서는 From -> Where -> Group by -> Having -> Select -> Order by ->결과반환

  1. FROM,JOIN,WITH 절: animal_outs와 animal_ins를 animal_id를 기준으로 left join한다. 보호는 되었지만 입양이 안될 경우 null값으로 나오기 때문에 null제외한 아이디, 이름과 입양일과 보호일의 차이(dates)를 조회하여 임시테이블을 만든다
  2. SELECT 절: 임시 테이블에서 아이디와 이름을 조회한다
  3. ORDER BY 절: 조회한 데이터를 입양일과 보호일의 차이가 큰순으로 조회한다
  4. 결과반환: 2명까지만 알기위해 limit를 사용하여 입양일과 보호일의 차이 큰 아이디와 이름을 구한다

 

다른사람 풀이

SELECT A.ANIMAL_ID, A.NAME
FROM ANIMAL_INS A JOIN ANIMAL_OUTS B ON A.ANIMAL_ID = B.ANIMAL_ID
WHERE B.DATETIME IS NOT NULL
ORDER BY B.DATETIME - A.DATETIME DESC
LIMIT 2

배운점

  • with절을 사용한다고 꼭 가독성이 높아지는건 아니다(다른사람 풀이가 더 보기 좋음)
  • left join의 사용성(기준이 되는 컬럼에 없는 데이터를 제거하기 위해: 보호테이블에는 있지만 입양테이블에는 없는 아이디를 제거하기 위해)
  • datediff(a,b)와 (a-b)가 동일할까? 순서는 동일할 수 있으니 의미는 애매..(oracle에서는 동일하다고 한다)
  • mysql에서 null값은 제일 우선에 위치시킨다(oracle은 반대)