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

MySQL dato/forfatter sammenligning

Jeg regner med, at du skal oprette en datoreferencetabel, udfylde den tabel og derefter LEFT OUTER JOIN fra den tabel i din forespørgsel. Problemet med 'Hvordan viser jeg manglende datoer?' er et ganske almindeligt SO-spørgsmål men jeg går efter det alligevel.

Foreløbig trin

Kør ved mysql-prompten:

use WordPress;

Trin 1 - Opret datoreferencetabel

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

Trin 2 - Udfyld datoreferencetabel

Ideen med denne tabel er at have én række for hver dato. Nu kan du opnå dette ved at køre insert statements ad nauseum, men hvorfor ikke skrive en rutine for at udfylde den for dig (du kan oprette en MySQL planlagt begivenhed for at sikre, at du altid har et komplet sæt datoer i tabellen. Her er et forslag til den rutine:

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 ;

Du kan nu køre:

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

For at udfylde alle datoer for oktober (eller bare skru op for days_into_the_future parameter til hvad du ønsker).

Nu hvor du har en datoreferencetabel med alle datoer, som du er interesseret i udfyldt, kan du gå videre og køre din forespørgsel for oktober:

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. Hvordan installeres pyodbc 64-bit?

  2. SqlServer:Login mislykkedes for brugeren

  3. Opret PostgreSQL ROLLE (bruger), hvis den ikke findes

  4. MySQL REGEXP Ingen mellemrum Ingen tal