2011-05-13 13 views
8

특정 기간 동안 하루에 작성된 블로그 게시물 수를 반환하는 쿼리를 작성하고 있습니다. 주어진 문제에 대한 블로그 기록이없는 경우 문제가 발생합니다. 내 쿼리를 사용하면 그 날의 결과를 간단히 건너 뜁니다. 그것은 어떤 게시물이 없기 때문에이 2011-01-03 누락되어MySQL GROUP BY 날짜 - 행이 없을 때 결과를 반환하는 방법

count | date 
_________________ 
2  | 2011-01-01 
5  | 2011-01-02 
1  | 2011-01-04 

주의 사항 :

SELECT DATE(`posted`), COUNT(`id`) 
    FROM `blogs` WHERE `status` = 'active' 
    && `posted` BETWEEN `2011-01-01` AND `2011-05-01` 
    GROUP BY DATE(`posted`) 

그것은 비슷한을 반환

여기 내 쿼리입니다.

게시물이있는 요일을 표시하려면 어떻게해야합니까?

답변

6
당신은을 통해 조회 할거야 모든 날짜를 포함하는 테이블을, 그리고 라인을 따라 뭔가를해야 할 것

...

SELECT DATE(D.`thedate`), COUNT(`id`) 
FROM `datetable` D 
LEFT JOIN `blogs` B 
ON B.`posted` = D.`thedate` 
WHERE `status` = 'active'  
&& D.`thedate` BETWEEN `2011-01-01` AND `2011-05-01`  
GROUP BY DATE(D.`thedate`) 
+0

어떻게 동적 인 방식으로 처리 할 수 ​​있습니까? 최신 통계를 원하고 임의로 날짜 범위를 선택할 수 있기를 원합니다. – johnnietheblack

+0

@johnnietheblack - 날짜 테이블에 1900에서 2100까지의 모든 날짜가 포함되어있는 경우 WHERE 절의 날짜를 여전히 필터링하므로 가능한 모든 쿼리를 처리 할 수있는 충분한 범위가 날짜 테이블에 포함되어 있는지 확인하십시오 (예 : - a bit overkill) 정말 중요하지 않습니다. -이 테이블의 날짜 열에 대한 색인을 만드십시오! –

0

이 날짜를 포함하는 테이블을 만들려면 (http://www.artfulsoftware.com/infotree/queries.php?&bw=1280#95에서 가져옴) :

-- Create a dummy view with 3 rows 
create or replace view v3 as select 1 n union all select 1 union all select 1; 
-- create a second dummy view with 10 rows 
-- By making joins with this view, you can create 100, 1000, ... rows 
create or replace view v as select 1 n from v3 a, v3 b union all select 1; 
-- counter 
set @n = 0; 
-- create date table 
drop table if exists datetable; 
create table datetable(thedate date primary key); 
-- populate from start date 
insert into datetable select cast('1970-1-1' + interval @n:[email protected]+1 day as date) as thedate 
from v a, v b, v c, v d, v e, v;