MySQL GROUP BY date - как вернуть результаты, когда строк нет - PullRequest
8 голосов
/ 13 мая 2011

Я пишу запрос, чтобы вернуть количество сообщений в блоге, написанных за день в течение определенного периода времени. Моя проблема возникает, когда на данный день нет записей блога. По моему запросу результат за этот день просто пропускается.

Вот мой запрос:

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

Возвращает что-то похожее на:

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

Обратите внимание, что он отсутствует 2011-01-03, потому что у него нет сообщений.

Как мне заставить его показывать те дни с 0 постами?

Ответы [ 2 ]

6 голосов
/ 13 мая 2011

Вам нужно иметь таблицу, которая содержит все даты, по которым вы собираетесь выполнить запрос, и делать что-то вроде ...

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 голосов
/ 13 мая 2011

Для создания таблицы, содержащей даты (взяты из 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:=@n+1 day as date) as thedate 
from v a, v b, v c, v d, v e, v;  
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...