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

Grupowanie według daty, zwróć wiersz, nawet jeśli nie znaleziono żadnych rekordów

MySQL nie ma funkcji rekurencyjnej, więc pozostaje Ci użycie sztuczki z tabelą NUMBERS -

  1. Utwórz tabelę, która zawiera tylko rosnące liczby - łatwo to zrobić za pomocą auto_increment:

    DROP TABLE IF EXISTS `example`.`numbers`;
    CREATE TABLE  `example`.`numbers` (
      `id` int(10) unsigned NOT NULL auto_increment,
       PRIMARY KEY  (`id`)
    ) ENGINE=InnoDB DEFAULT CHARSET=latin1;
    
  2. Wypełnij tabelę za pomocą:

    INSERT INTO NUMBERS
      (id)
    VALUES
      (NULL)
    

    ...dla tylu wartości, ile potrzebujesz.

  3. Użyj DATE_ADD aby skonstruować listę dat, zwiększając liczbę dni na podstawie wartości NUMBERS.id. Zastąp „2010-01-01” i „2010-03-01” odpowiednimi datami rozpoczęcia i zakończenia (ale użyj tego samego formatu, RRRR-MM-DD) -

    SELECT x.*
      FROM (SELECT DATE_ADD('2010-01-01', INTERVAL n.id - 1 DAY)
              FROM numbers n
             WHERE DATE_ADD('2010-01-01', INTERVAL n.id -1 DAY) <= '2010-03-01' ) x
    
  4. LEFT JOIN do tabeli danych na podstawie części daty i godziny:

       SELECT DATE(x.dt) AS dt,
              COALESCE(SUM(e.value), 0) AS sum_value
         FROM (SELECT DATE_ADD('2010-01-01', INTERVAL n.id - 1 DAY) AS dt
                 FROM numbers n
                WHERE DATE_ADD('2010-01-01', INTERVAL n.id -1 DAY) <= '2010-03-01' ) x
    LEFT JOIN ENTRY e ON DATE(e.datetime) = x.dt
                     AND e.entryid = 85
     GROUP BY DATE(x.dt) 
    

Dlaczego liczby, a nie daty?

Proste - daty mogą być generowane na podstawie liczby, jak w podanym przeze mnie przykładzie. Oznacza to również użycie jednej tabeli, w przeciwieństwie do jednej na typ danych.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Czy są jakieś ograniczenia długości łańcucha w mysql?

  2. Wdróż bazę danych MySQL w chmurze hybrydowej za pomocą ClusterControl

  3. PHP PDO SQL zwraca tylko jeden wiersz danych zamiast wszystkich wierszy

  4. wstaw znak Unicode w bazach danych

  5. Czy nazwy tabel w MySQL rozróżniają wielkość liter?