[TIL] 6일차 - MySQL

Daehyun·2023년 1월 4일
0

[TIL]

목록 보기
6/6

mysql 문제를 풀면서 가장 오랫동안 고민을 했던 문제다.
with recursive를 통해 가상테이블을 만든 후 join을 통해 문제를 해결할 수 있었다.

입양 시간 구하기(2)

처음에는 입양시간 별 횟수를 구하는 쿼리는 작성했다.

SELECT HOUR(DATETIME) as HOUR, count(*) as COUNT
from ANIMAL_OUTS
group by HOUR
order by HOUR

결과는 다음과 같다.

위 결과를 보면 0~6시와 20~23시에는 입양을 하지 않아 데이터가 존재하지 않는다. 그래서 해당 시간의 데이터를 만들어서 출력을 해야했다. 다양한 시도를 하는 과정에서 with recursive라는 것을 알게 되었다.

📌 WITH RECURSIVE

WITH RECURSIVE 구문은 가상 테이블을 생성하면서 가상 테이블 자신의 값을 참조하여 값을 결정할 때 사용된다.

해당 구문을 사용하여 데이터가 존재하지 않는 부분을 채워넣은 가상테이블을 하나 만들었다.

with recursive time as (
    select 0 as HOUR // 초기값 설정
    union
    select HOUR + 1
    from time
    where HOUR < 23 // recursive 탈출 조건
) // 0~23시까지의 가상테이블(time) 생성

SELECT b.HOUR, count(a.DATETIME) as COUNT
from ANIMAL_OUTS a
right join time b
on HOUR(a.DATETIME) = b.HOUR
group by b.HOUR
order by b.HOUR

위와 같이 작성해주면 입양이 되지 않는 시간대의 count도 0으로 출력이 된다.

참고

https://horang98.tistory.com/10

0개의 댓글