[mySQL] Dane z bazy pogrupowane wg daty

Odpowiedz Nowy wątek
2020-02-08 20:13

Rejestracja: 6 lat temu

Ostatnio: 24 sekundy temu

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

edytowany 4x, ostatnio: NewUser2k13, 2020-02-08 20:20

Pozostało 580 znaków

2020-02-08 23:23

Rejestracja: 8 lat temu

Ostatnio: 35 minut temu

1

musisz pobrać wszystkie daty z danego zakresu np. tak jak tutaj https://stackoverflow.com/que[...]o-dates-in-mysql-select-query i do nich dołączyć swoje dane, łącząc je po dacie


Chcesz pomocy - pokaż kod - abrakadabra źle działa z techniką.

Pozostało 580 znaków

2020-02-09 00:52

Rejestracja: 7 miesięcy temu

Ostatnio: 3 tygodnie temu

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;

Pozostało 580 znaków

Odpowiedz

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