sql >> Base de Datos >  >> RDS >> Mysql

Comparación de fecha/autor de MySQL

Creo que debe crear una tabla de referencia de fecha, llenar esa tabla y luego LEFT OUTER JOIN de esa tabla en su consulta. El problema de '¿Cómo puedo mostrar las fechas que faltan?' es una pregunta SO común pero lo haré de todos modos.

Paso preliminar

En el indicador de mysql, ejecute:

use WordPress;

Paso 1:crear una tabla de referencia de fechas

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

Paso 2:completar la tabla de referencia de fecha

La idea de esta tabla es tener una fila para cada fecha. Ahora puede lograr esto ejecutando declaraciones de inserción hasta la saciedad, pero ¿por qué no escribir una rutina para completarla por usted (podría crear un evento Evento programado de MySQL para asegurarse de tener siempre un conjunto completo de fechas en la tabla. Aquí hay una sugerencia para esa rutina:

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 ;

Ahora puede ejecutar:

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

Para completar todas las fechas de octubre (o simplemente aumentar los days_into_the_future parámetro a lo que quieras).

Ahora que tiene una tabla de referencia de fechas con todas las fechas que le interesan, puede continuar y ejecutar su consulta para octubre:

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