
안녕하세요.
SQL 강의를 다 듣고 현업에서 가끔 SQL을 만지다가 제가 짠 쿼리인데 한가지 문제가 있어 질문을 드립니다. 사수가 없어서 고군분투 하는데 너무 안 풀리네요ㅜㅜ.
제가 원하는건
access_log 테이블(회원, 비회원의 접속 기록을 저장-회원번호, 접속일시, 에이전트 등 정보 저장, 통계 낼 때는 그룹바이로 카운트 해서 활용)에서 정보를 뽑아와서 이런 결과를 내고 싶습니다.
+------------+---------+-------------+-----------+
| date | mem_cnt | non_mem_cnt | total_cnt |
+------------+---------+-------------+-----------+
| 2022-09-15 | 0 | 0 | 0 |
| 2022-09-16 | 0 | 0 | 0 |
| 2022-09-17 | 0 | 0 | 0 |
| 2022-09-18 | 0 | 0 | 0 |
| 2022-09-19 | 0 | 0 | 0 |
...중략...
| 2023-04-11 | 0 | 12 | 12 |
+------------+---------+-------------+-----------+
쿼리에서 의도한 것은, 22년 9월 15일 ~ 23년 4월 11일 사이의 회원, 비회원, 전체(회원+비회원) 접속자 수를 출력하는 것입니다.
즉, 209일 치의 레코드가 출력되어야 합니다.
문제는
access_log에 114개의 레코드만 있으면 22년 9월 15일부터 114개의 레코드까지(23년 1월 16일)만 출력이 된다는 것입니다.
제가 LIMIT cluase로 209를 걸어놨는데, access_log의 레코드 수가 209보다 작으면 114개까지만 출력되는 것 같습니다.
제가 의도한 것과 같이, LIMIT 개수대로 레코드를 출력하는 쿼리를 만드려면 제 쿼리를 어떻게 수정해야 할까요?ㅜㅜ
(퇴근길에 핸드폰으로 작성하다 보니 줄바꿈 등 이상한 부분이 있을 수도 있어서 미리 죄송합니다)
SELECT b.date, IFNULL(mem.cnt, 0) AS mem_cnt, IFNULL(non_mem.cnt, 0) AS non_mem_cnt, IFNULL(mem.cnt, 0)+IFNULL(non_mem.cnt, 0) AS total_cnt
FROM (
SELECT DATE_FORMAT(datetime, '%Y-%m-%d')AS date, COUNT(*) AS cnt
FROM access_log
WHERE datetime BETWEEN '2022-09-15 00:00:00' AND '2023-04-11 23:59:59' AND member_seq != 0
GROUP BY DATE_FORMAT(datetime, '%Y-%m-%d')) mem
RIGHT JOIN (
SELECT DATE_FORMAT(datetime, '%Y-%m-%d')AS date, COUNT(*) AS cnt
FROM dmss_access_log
WHERE datetime BETWEEN '2022-09-15 00:00:00' AND '2023-04-11 23:59:59' AND member_seq = 0
GROUP BY DATE_FORMAT(datetime, '%Y-%m-%d')) non_mem
ON mem.date = non_mem.date
RIGHT JOIN (
SELECT @n := @n +1 AS n , DATE_FORMAT(DATE_ADD('2022-09-15', INTERVAL @n -1 day),'%Y-%m-%d') AS date
FROM (dmss_access_log), (
SELECT @N:=0
FROM DUAL) a
LIMIT 209 ) b
ON non_mem.date = b.date
ORDER BY b.date ASC
