Mysql
 sql >> Base de données >  >> RDS >> Mysql

Comparaison date/auteur MySQL

Je pense que vous devriez créer une table de référence de date, remplir cette table, puis LEFT OUTER JOIN de cette table dans votre requête. Le problème de "Comment afficher les dates manquantes ?" est une question SO commune mais je vais y aller quand même.

Étape préliminaire

À l'invite mysql, exécutez :

use WordPress;

Étape 1 - Créer une table de référence de date

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

Étape 2 - Remplir le tableau de référence de date

L'idée de ce tableau est d'avoir une ligne pour chaque date. Maintenant, vous pouvez y parvenir en exécutant des instructions d'insertion ad nauseum, mais pourquoi ne pas écrire une routine pour la remplir pour vous (vous pouvez éventuellement créer un Événement planifié MySQL pour vous assurer que vous avez toujours un ensemble complet de dates dans le tableau. Voici une suggestion pour cette 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 ;

Vous pouvez maintenant exécuter :

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

Pour remplir toutes les dates d'octobre (ou simplement augmenter les days_into_the_future paramètre à ce que vous voulez).

Maintenant que vous avez une table de référence de dates avec toutes les dates qui vous intéressent, vous pouvez continuer et exécuter votre requête pour octobre :

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