sql >> Databáze >  >> RDS >> Mysql

Porovnání data/autora MySQL

Domnívám se, že byste měli vytvořit referenční tabulku data, naplnit tuto tabulku a poté LEFT OUTER JOIN z této tabulky ve vašem dotazu. Problém „Jak zobrazím chybějící data?“ je docela běžná SO otázka ale stejně do toho půjdu.

Předběžný krok

Na výzvu mysql spusťte:

use WordPress;

Krok 1 – Vytvoření referenční tabulky data

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

Krok 2 – Vyplnění referenční tabulky data

Smyslem této tabulky je mít jeden řádek pro každé datum. Nyní byste toho mohli dosáhnout spuštěním příkazů insert ad nauseum, ale proč nenapsat rutinu, která to naplní za vás (můžete vytvořit událost plánovaná událost MySQL abyste zajistili, že budete mít v tabulce vždy kompletní sadu dat. Zde je návrh pro tuto rutinu:

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 ;

Nyní můžete spustit:

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

Chcete-li naplnit všechna data pro říjen (nebo jen nastavit days_into_the_future parametr na cokoli chcete).

Nyní, když máte referenční tabulku data se všemi daty, která vás zajímají, můžete pokračovat a spustit dotaz na říjen:

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. Aktualizujte režim SQL v MySQL

  2. jak vytvořit spouštěč aktualizace pro zvýšení/snížení 1 čísla na celkový počet hlasů

  3. Součet několika sloupců MySQL uložených v jiném sloupci?

  4. Jak zkontrolovat, zda daná data existují ve více tabulkách (všechny mají stejný sloupec)?