sql >> Databasteknik >  >> RDS >> Mysql

Jämförelse av MySQL datum/författare

Jag tycker att du ska skapa en datumreferenstabell, fylla i den tabellen och sedan LEFT OUTER JOIN från den tabellen i din fråga. Problemet med "Hur visar jag saknade datum?" är en ganska vanlig SO-fråga men jag tar det ändå.

Förberedande steg

Vid mysql-prompten kör:

use WordPress;

Steg 1 – Skapa datumreferenstabell

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

Steg 2 – Fyll i datumreferenstabell

Tanken med denna tabell är att ha en rad för varje datum. Nu kan du uppnå detta genom att köra insert statements ad nauseum men varför inte skriva en rutin för att fylla i den åt dig (du kan skapa en schemalagda MySQL-evenemang för att säkerställa att du alltid har en komplett uppsättning datum i tabellen. Här är ett förslag för den rutinen:

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öra:

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

För att fylla i alla datum för oktober (eller bara höja days_into_the_future parameter till vad du vill).

Nu när du har en datumreferenstabell med alla datum som du är intresserad av kan du köra din fråga för 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. Skriver du en arvsfråga skriven i SQL med en inre join?

  2. Hur kombinerar man nästan samma objekt med SQL?

  3. Behöver jag en php mysql-anslutning i varje funktion som använder databas?

  4. MySQL - Adjacency List Model - Få djup