Mysql
 sql >> Baza danych >  >> RDS >> Mysql

Porównanie daty i autora MySQL

Uważam, że powinieneś utworzyć tabelę dat odniesienia, wypełnić tę tabelę, a następnie LEFT OUTER JOIN z tej tabeli w zapytaniu. Problem „Jak wyświetlić brakujące daty?” jest dość częstym pytaniem SO ale i tak na to pójdę.

Krok wstępny

W wierszu polecenia mysql uruchom:

use WordPress;

Krok 1 – Utwórz tabelę referencyjną dat

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 – Wypełnij tabelę referencyjną dat

Ideą tej tabeli jest posiadanie jednego wiersza na każdą datę. Teraz możesz to osiągnąć, uruchamiając instrukcje insert ad nudności, ale dlaczego nie napisać procedury, która zapełni ją za Ciebie (możesz stworzyć Zaplanowane wydarzenie MySQL aby upewnić się, że zawsze masz pełny zestaw dat w tabeli. Oto sugestia dla tej procedury:

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 ;

Możesz teraz uruchomić:

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

Aby wypełnić wszystkie daty na październik (lub po prostu podkręć days_into_the_future parametr na cokolwiek chcesz).

Teraz, gdy masz już tabelę referencyjną dat zawierającą wszystkie interesujące Cię daty, możesz uruchomić zapytanie dla października:

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. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Tworzenie typu zmiennej ENUM w MySQL

  2. implikacje bezpieczeństwa konfiguracji grupy bezpieczeństwa mysql aws

  3. Wybierz dzień tygodnia od daty

  4. Python, mysql.connector Błąd:brak zestawu wyników do pobrania z; cgitb pokazuje poprawną wartość przekazywaną do funkcji

  5. MySQL - Jak przestawić kolumny na wiersze?