sql >> Database >  >> RDS >> Mysql

MySQL datum/auteur vergelijking

Ik denk dat je een datumreferentietabel moet maken, die tabel moet vullen en dan LEFT OUTER JOIN uit die tabel in uw query. Het probleem van 'Hoe geef ik ontbrekende datums weer?' is nogal een veelvoorkomende SO-vraag maar ik ga er toch voor.

Voorstap

Voer bij de mysql-prompt het volgende uit:

use WordPress;

Stap 1 - Datumreferentietabel maken

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

Stap 2 - Datumreferentietabel invullen

Het idee van deze tabel is om voor elke datum één rij te hebben. Nu zou je dit kunnen bereiken door invoeginstructies ad nauseum uit te voeren, maar waarom zou je geen routine schrijven om het voor je te vullen (je zou een evenement kunnen maken een MySQL gepland evenement om ervoor te zorgen dat u altijd een volledige set datums in de tabel heeft. Hier is een suggestie voor die 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 ;

U kunt nu uitvoeren:

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

Om alle datums voor oktober in te vullen (of gewoon de days_into_the_future te verhogen parameter naar wat je maar wilt).

Nu u een datumreferentietabel heeft met alle datums waarin u geïnteresseerd bent, kunt u doorgaan en uw zoekopdracht voor oktober uitvoeren:

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


  1. mysql ontsnapt aan enkele en dubbele aanhalingstekens

  2. Is er een beste manier om te voorkomen dat een proces meer dan eens in Oracle wordt uitgevoerd?

  3. 3 manieren om de positie van een subtekenreeks binnen een tekenreeks in MySQL te vinden

  4. Wat zijn de voor- en nadelen van het opslaan van bestanden in een database?