
안녕하세요.
SQL 강의를 다 듣고 현업에서 가끔 SQL을 만지다가 제가 '연습으로' 짠 쿼리인데 한가지 문제가 있어 질문을 드립니다. 사수가 없어서 고군분투 하는데 너무 안 풀리네요ㅜㅜ.
테이블 생성구문, 데이터 입력 구문 작성해서 재질문합니다.
--테이블 생성
CREATE TABLE access_log (
seq INT UNSIGNED NOT NULL AUTO_INCREMENT,
member_seq INT UNSIGNED NOT NULL DEFAULT 0,
ip CHAR(15) NOT NULL DEFAULT '',
`datetime` DATETIME NOT NULL DEFAULT '1000-01-01 00:00:00',
PRIMARY KEY (seq)
);
-- 데이터 입력 (8개)
INSERT INTO access_log (member_seq, ip, `datetime`) VALUES ('1', '111', '2023-04-01 11:11:11');
INSERT INTO access_log (member_seq, ip, `datetime`) VALUES ('2', '112', '2023-04-01 11:11:12');
INSERT INTO access_log (member_seq, ip, `datetime`) VALUES ('3', '113', '2023-04-01 11:11:13');
INSERT INTO access_log (member_seq, ip, `datetime`) VALUES ('4', '114', '2023-04-04 11:11:11');
INSERT INTO access_log (member_seq, ip, `datetime`) VALUES ('0', '111', '2023-04-05 11:11:11');
INSERT INTO access_log (member_seq, ip, `datetime`) VALUES ('0', '112', '2023-04-06 11:11:11');
INSERT INTO access_log (member_seq, ip, `datetime`) VALUES ('3', '113', '2023-04-06 11:11:11');
INSERT INTO access_log (member_seq, ip, `datetime`) VALUES ('4', '114', '2023-04-11 11:11:11');
-- 쿼리
-- 의도: 23년 4월 1일부터 23년 4월 11일까지, 11일치의 일자별 방문자 통계 출력
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 '2023-04-01 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 access_log
WHERE datetime BETWEEN '2023-04-01 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('2023-04-01', INTERVAL @n -1 day),'%Y-%m-%d') AS date
FROM (access_log),
(
SELECT @N:=0
FROM DUAL) a
LIMIT 11 ) b
ON non_mem.date = b.date
ORDER BY b.date ASC
제가 원하는건
access_log 테이블 에서 정보를 뽑아와서 이것과 같은 결과를 내고 싶습니다.
(11일치의 집계 데이터 = 11개의 레코드 출력)
+------------+---------+-------------+-----------+
| date | mem_cnt | non_mem_cnt | total_cnt |
+------------+---------+-------------+-----------+
| 2023-04-01 | 0 | 0 | 0 |
| 2023-04-02 | 0 | 0 | 0 |
| 2023-04-03 | 0 | 0 | 0 |
| 2023-04-04 | 0 | 1 | 1 |
| 2023-04-05 | 0 | 1 | 1 |
| 2023-04-06 | 1 | 1 | 2 |
| 2023-04-07 | 0 | 0 | 0 |
| 2023-04-08 | 0 | 0 | 0 |
| 2023-04-09 | 0 | 0 | 0 |
| 2023-04-10 | 0 | 0 | 0 |
| 2023-04-11 | 1 | 0 | 1 |
+------------+---------+-------------+-----------+
현재 문제는,
제 의도대로라면 'LIMIT 11' 구문을 사용한 효과로 4월 1일~4월 11일에 해당하는 11개의 레코드가 출력되어야 하나,
8개만 출력되고 있습니다.
왜 8개만 출력되는지 잘 이해를 못하겠습니다.
제 의도와 같이 지정한 기간에 해당하는 데이터 11개를 출력하려면 구문을 어떻게 수정해야 하는지 도움을 부탁드립니다ㅜㅜ.
테이블 1개 갖고 조작하는거고, 강의에서 배웠던 LIMIT, Subquery, JOIN, 집계함수 사용했고 강의 이외의 문법은 사용하지 않았습니다.
업무에 필요한 내용은 아니고, 그냥 현업에서 볼 수 있는 테이블로 혼자 공부하는 차원에서 집계하려고 하는거라서요.
제 쿼리가 어지럽다면 다 날리셔도 정말 상관 없고, 튜터님들이라면 어떻게 접근하실지 의견 나누고 싶습니다.
쿼리를 작성할 때는 효율보다는 정확히 작성하는게 중요하다고 강의에서 배웠습니다.
답변이 어려우시다면... 강의에서 배운 것 갖고는 한계가 있는건지 궁금합니다ㅜ
