문 제
접근
- ANIMAL_OUTS 테이블에는 시간이 0부터 나와있지 않다.
- 조인 할 수 있는 테이블이 필요여기서..생겨난 문제..
0부터 23까지의 테이블을 어떻게 만들지??....
일단 0~23까지를 가진 테이블이 필요하기 때문에 mysql에서 임시테이블을 만드는 방법을 찾아보았다.
그러다 찾은 방법이 with절!
(mysql8.0 이후 부터 사용가능)
사용방법
WITH '임시테이블명' AS
(
생성할 쿼리
)
with 절에는 재귀, 비재귀 두가지 방법이 있고, 0~23까지를 가진 임시테이블을 재귀 방식을 통해 해결할 수 있다고 한다.
그렇게 해서 나온 방법이 !! 초깃값 0인 HOUR을 시작으로 +1 씩 23 이하일 경우까지 반복해서 임시테이블을 생성한다.
WITH RECURSIVE TIME AS (
SELECT 0 HOUR
UNION ALL
SELECT HOUR + 1 FROM SS WHERE HOUR < 23
)
다음, 생성된 TIME 임시 테이블과 ANIMAL_OUTS 테이블의 DATETIME 필드를 활용하여 결괏값을 도출해 낸다.
SELECT TIME.HOUR, COUNT(HOUR(OUTS.DATETIME)) AS COUNT
FROM TIME
LEFT JOIN ANIMAL_OUTS AS OUTS
ON TIME.HOUR = HOUR(OUTS.DATETIME)
GROUP BY TIME.HOUR
with 절
1. with는 view와 달리 결괏값이 저장된다고 한다.
2. 한번 정의하고 여러군데에서 사용할수록 효과가 좋다.
3. 쿼리를 저장하는 것이 아닌 결괏값을 저장함으로 여러번 사용하여도 연산을 줄일 수 있다.