Mysql
 sql >> Database >  >> RDS >> Mysql

Confronto data/autore MySQL

Penso che dovresti creare una tabella di riferimento della data, popolare quella tabella e quindi LEFT OUTER JOIN da quella tabella nella tua query. Il problema di "Come faccio a visualizzare le date mancanti?" è una domanda SO comune ma ci andrò comunque.

Passo preliminare

Al prompt di mysql esegui:

use WordPress;

Passaggio 1:crea una tabella di riferimento della data

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

Passaggio 2:popola la tabella di riferimento della data

L'idea di questa tabella è di avere una riga per ogni data. Ora potresti ottenere questo eseguendo le istruzioni di inserimento ad nauseum, ma perché non scrivere una routine per popolarla per te (potresti creare un evento Evento pianificato MySQL per assicurarti di avere sempre una serie completa di date nella tabella. Ecco un suggerimento per quella 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 ;

Ora puoi eseguire:

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

Per popolare tutte le date di ottobre (o semplicemente aumentare i days_into_the_future parametro a quello che vuoi).

Ora che hai una tabella di riferimento delle date con tutte le date che ti interessano, puoi procedere ed eseguire la tua query per ottobre:

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