Tôi nghĩ rằng bạn nên tạo một bảng tham chiếu ngày, điền bảng đó và sau đó LEFT OUTER JOIN
từ bảng đó trong truy vấn của bạn. Vấn đề 'Làm cách nào để hiển thị ngày bị thiếu?' khá là một câu hỏi SO phổ biến nhưng tôi vẫn sẽ tiếp tục.
Bước trước
Tại dấu nhắc mysql chạy:
use WordPress;
Bước 1 - Tạo Bảng Tham chiếu Ngày
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));
Bước 2 - Điền Bảng Tham chiếu Ngày
Ý tưởng của bảng này là có một hàng cho mỗi ngày. Bây giờ bạn có thể đạt được điều này bằng cách chạy câu lệnh chèn ad nauseum nhưng tại sao không viết một quy trình để điền nó cho bạn (bạn có thể tạo một Sự kiện đã lên lịch trong MySQL để đảm bảo rằng bạn luôn có một bộ ngày hoàn chỉnh trong bảng. Đây là một gợi ý cho quy trình đó:
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 ;
Bây giờ bạn có thể chạy:
call populate_all_dates('2011-10-01',30);
Để điền tất cả các ngày cho tháng 10 (hoặc chỉ tạo days_into_the_future
tham số cho bất cứ điều gì bạn muốn).
Bây giờ bạn đã có một bảng tham chiếu ngày với tất cả các ngày mà bạn muốn điền vào, bạn có thể tiếp tục và chạy truy vấn của mình cho tháng 10:
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);