Mysql
 sql >> Datenbank >  >> RDS >> Mysql

MySQL-Datum/Autor-Vergleich

Ich denke, Sie sollten eine Datumsreferenztabelle erstellen, diese Tabelle füllen und dann LEFT OUTER JOIN aus dieser Tabelle in Ihrer Abfrage. Das Problem "Wie zeige ich fehlende Daten an?" ist eine ziemlich häufige SO-Frage aber ich werde es trotzdem versuchen.

Vorstufe

Führen Sie am mysql-Prompt Folgendes aus:

use WordPress;

Schritt 1 – Datumsreferenztabelle erstellen

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));

Schritt 2 – Datumsreferenztabelle ausfüllen

Die Idee dieser Tabelle ist, für jedes Datum eine Zeile zu haben. Jetzt könnten Sie dies erreichen, indem Sie Einfügeanweisungen bis zum Überdruss ausführen, aber warum nicht eine Routine schreiben, um sie für Sie zu füllen (Sie könnten einen Geplantes MySQL-Ereignis um sicherzustellen, dass Sie immer einen vollständigen Satz von Daten in der Tabelle haben. Hier ist ein Vorschlag für diese 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 ;

Sie können jetzt Folgendes ausführen:

call populate_all_dates('2011-10-01',30);

Um alle Daten für Oktober auszufüllen (oder kurbeln Sie einfach die days_into_the_future an Parameter wie gewünscht).

Da Sie nun eine Datumsreferenztabelle mit allen Datumsangaben haben, die Sie interessieren, können Sie fortfahren und Ihre Abfrage für Oktober ausführen:

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);