Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Comparação de data/autor do MySQL


Eu acho que você deve criar uma tabela de referência de data, preencher essa tabela e depois LEFT OUTER JOIN dessa tabela em sua consulta. O problema de 'Como faço para exibir datas ausentes?' é uma pergunta SO comum mas eu vou mesmo assim.

Etapa preliminar

No prompt do mysql execute:
use WordPress;

Etapa 1 - Criar tabela de referência de 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));

Etapa 2 - Preencher a tabela de referência de data

A ideia desta tabela é ter uma linha para cada data. Agora você pode conseguir isso executando instruções de inserção ad nauseum, mas por que não escrever uma rotina para preenchê-la para você (você pode criar um evento Evento programado do MySQL para garantir que você sempre tenha um conjunto completo de datas na tabela. Aqui está uma sugestão para essa rotina:
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 ;

Agora você pode executar:
call populate_all_dates('2011-10-01',30);

Para preencher todas as datas de outubro (ou apenas aumentar os days_into_the_future parâmetro para o que você quiser).

Agora que você tem uma tabela de referência de datas com todas as datas de seu interesse preenchidas, vá em frente e execute sua consulta para outubro:
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);