[mySQL] Dane z bazy pogrupowane wg daty

0

Witam,
Posiadam bazę ze strukturą jak na załączonym screenie:
title

Chciałbym pobrać wszystkie rekordy pogrupowane względem daty.
Docelowo pobierał będę daty do 2 tygodni wstecz. Jeśli w jakimś dniu nie będzie wpisów, to chciałbym aby on również się pojawił ale z wartością 0

Taki wynikowy rezultat bym chciał uzyskać.
DATA => ILOSĆ
2020-01-26 => 0
2020-01-27 => 0
2020-01-28 => 0
2020-01-29 => 0
2020-01-30 => 0
2020-01-31 => 0
2020-02-01 => 0

2020-02-02 => 0
2020-02-03 => 0
2020-02-04 => 1
2020-02-05 => 2
2020-02-06 => 0
2020-02-07 => 3
2020-02-08 => 4

O ile pobieranie wartości, które są w bazie i grupowanie ich wg daty nie jest problemem, to kompletnie nie wiem jak zabrać się za daty "zerowe", które de;facto nie istnieją w bazie.
Chciałbym zrobić to najbardziej optymalnie i o ile to możliwe po stronie bazy danych

1

musisz pobrać wszystkie daty z danego zakresu np. tak jak tutaj https://stackoverflow.com/questions/9295616/how-to-get-list-of-dates-between-two-dates-in-mysql-select-query i do nich dołączyć swoje dane, łącząc je po dacie

1

Twoje zapytanie z grubsza może wyglądać tak jak poniżej.
PS. ustawiłem generowanie 14 dni wstecz od obecnej daty tak jak wspominałeś. Jeśli zmieni Ci się zakres danych zmień w warunkach podzapytania '-14' na dowolną wartość.

  SELECT data_zdarzenia
      , COUNT(zdarzenie) 
   FROM tabela1 AS tab1
  RIGHT JOIN (  
			 SELECT a.data_zdarzenia2 
			   FROM (SELECT curdate() - INTERVAL (a.a + (10 * b.a) + (100 * c.a) + (1000 * d.a) ) DAY as data_zdarzenia2
					   FROM 	 (SELECT 0 as a union all SELECT 1 union all SELECT 2 union all SELECT 3 union all SELECT 4 union all SELECT 5 union all SELECT 6 union all SELECT 7 union all SELECT 8 union all SELECT 9) as a
					  CROSS JOIN (SELECT 0 as a union all SELECT 1 union all SELECT 2 union all SELECT 3 union all SELECT 4 union all SELECT 5 union all SELECT 6 union all SELECT 7 union all SELECT 8 union all SELECT 9) as b
					  CROSS JOIN (SELECT 0 as a union all SELECT 1 union all SELECT 2 union all SELECT 3 union all SELECT 4 union all SELECT 5 union all SELECT 6 union all SELECT 7 union all SELECT 8 union all SELECT 9) as c
					  CROSS JOIN (SELECT 0 as a union all SELECT 1 union all SELECT 2 union all SELECT 3 union all SELECT 4 union all SELECT 5 union all SELECT 6 union all SELECT 7 union all SELECT 8 union all SELECT 9) as d
					) a
			  WHERE a.data_zdarzenia2 between ADDDATE(CURRENT_DATE,-14) AND CURRENT_DATE()
			 ) tab2
	 ON tab1.data_zdarzenia = tab2.data_zdarzenia2
  GROUP BY data_zdarzenia;

1 użytkowników online, w tym zalogowanych: 0, gości: 1