Я считаю, что вы должны создать справочную таблицу дат, заполнить эту таблицу, а затем LEFT OUTER JOIN
из этой таблицы в своем запросе.Проблема «Как отобразить недостающие даты?»это довольно общий вопрос SO , но я все равно пойду на него.
Предварительный шаг
При запуске mysql:
use WordPress;
Шаг 1 - Создать справочную таблицу дат
create table all_date
(id int unsigned not null primary key auto_increment,
a_date date not null,
last_modified timestamp not null default current_timestamp on update current_timestamp,
unique key `all_date_uidx1` (a_date));
Шаг 2 - Заполнить справочную таблицу дат
Идеяэта таблица должна иметь одну строку для каждой даты.Теперь вы могли бы достичь этого, выполнив операторы вставки ad nauseum, но почему бы не написать подпрограмму для ее заполнения (вы можете создать событие MySQL по расписанию , чтобы у вас всегда был полный набор дат вТаблица. Вот предложение для этой процедуры:
DELIMITER //
CREATE PROCEDURE populate_all_dates(IN from_date DATE, IN days_into_future INT)
BEGIN
DECLARE v_date DATE;
DECLARE ix int;
SET ix := 0;
SET v_date := from_date;
WHILE v_date <= (from_date + interval days_into_future day) DO
insert into all_date (a_date) values (v_date)
on duplicate key update last_modified = now();
set ix := ix +1;
set v_date := from_date + interval ix day;
END WHILE;
END//
DELIMITER ;
Теперь вы можете выполнить:
call populate_all_dates('2011-10-01',30);
Чтобы заполнить все даты за октябрь (или просто поверните параметр days_into_the_future
довсе, что вы хотите).
Теперь, когда у вас есть справочная таблица дат со всеми интересующими вас датами, вы можете продолжить и выполнить свой запрос на октябрь:
select day(a.a_date) as 'October',
IFNULL(t.a1,0) as 'Auth1',
IFNULL(t.a2,0) as 'Auth2',
IFNULL(t.a50,0) as 'Auth50'
from all_date a
LEFT OUTER JOIN
(
SELECT date(wp.post_date) as post_date,
sum(case when wp.post_author = '1' then 1 else 0 end) as a1,
sum(case when wp.post_author = '2' then 1 else 0 end) as a2,
sum(case when wp.post_author = '50' then 1 else 0 end) as a50,
count(*) as 'All Auths'
FROM wp_posts wp
WHERE wp.post_type = 'post'
AND wp.post_date between '2011-10-01' and '2011-10-31 23:59:59'
GROUP BY date(wp.post_date)
) t
ON a.a_date = t.post_date
where a.a_date between '2011-10-01' and '2011-10-31'
group by day(a.a_date);