Saya rasa Anda harus membuat tabel referensi tanggal, mengisi tabel itu dan kemudian LEFT OUTER JOIN
dari tabel itu dalam kueri Anda. Masalah 'Bagaimana Saya Menampilkan Tanggal yang Hilang?' adalah pertanyaan SO umum tapi aku akan tetap melakukannya.
Langkah Awal
Saat menjalankan perintah mysql:
use WordPress;
Langkah 1 - Buat Tabel Referensi Tanggal
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));
Langkah 2 - Isi Tabel Referensi Tanggal
Ide tabel ini adalah memiliki satu baris untuk setiap tanggal. Sekarang Anda dapat mencapainya dengan menjalankan pernyataan penyisipan ad nauseum tetapi mengapa tidak menulis rutin untuk mengisinya untuk Anda (Anda dapat membuat acara Acara terjadwal MySQL untuk memastikan bahwa Anda selalu memiliki set tanggal yang lengkap dalam tabel. Berikut saran untuk rutinitas itu:
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 ;
Anda sekarang dapat menjalankan:
call populate_all_dates('2011-10-01',30);
Untuk mengisi semua tanggal untuk bulan Oktober (atau cukup aktifkan days_into_the_future
parameter apa pun yang Anda inginkan).
Sekarang setelah Anda memiliki tabel referensi tanggal dengan semua tanggal yang ingin Anda isi, Anda dapat melanjutkan dan menjalankan kueri Anda untuk bulan Oktober:
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);