Ik denk dat je een datumreferentietabel moet maken, die tabel moet vullen en dan LEFT OUTER JOIN
uit die tabel in uw query. Het probleem van 'Hoe geef ik ontbrekende datums weer?' is nogal een veelvoorkomende SO-vraag maar ik ga er toch voor.
Voorstap
Voer bij de mysql-prompt het volgende uit:
use WordPress;
Stap 1 - Datumreferentietabel maken
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));
Stap 2 - Datumreferentietabel invullen
Het idee van deze tabel is om voor elke datum één rij te hebben. Nu zou je dit kunnen bereiken door invoeginstructies ad nauseum uit te voeren, maar waarom zou je geen routine schrijven om het voor je te vullen (je zou een evenement kunnen maken een MySQL gepland evenement om ervoor te zorgen dat u altijd een volledige set datums in de tabel heeft. Hier is een suggestie voor die routine:
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 ;
U kunt nu uitvoeren:
call populate_all_dates('2011-10-01',30);
Om alle datums voor oktober in te vullen (of gewoon de days_into_the_future
te verhogen parameter naar wat je maar wilt).
Nu u een datumreferentietabel heeft met alle datums waarin u geïnteresseerd bent, kunt u doorgaan en uw zoekopdracht voor oktober uitvoeren:
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);