Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Gruppierung nach Datum, Zeile zurückgeben, auch wenn keine Datensätze gefunden werden

MySQL hat keine rekursive Funktionalität, also bleibt Ihnen die Verwendung des NUMBERS-Tabellentricks -

  1. Erstellen Sie eine Tabelle, die nur aufsteigende Zahlen enthält - einfach mit einem 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. Füllen Sie die Tabelle mit:

    INSERT INTO NUMBERS
      (id)
    VALUES
      (NULL)
    

    ...für beliebig viele Werte.

  3. Verwenden Sie DATE_ADD zum Erstellen einer Datumsliste, wobei die Tage basierend auf dem Wert von NUMBERS.id erhöht werden. Ersetzen Sie „2010-01-01“ und „2010-03-01“ durch Ihre jeweiligen Start- und Enddaten (aber verwenden Sie dasselbe Format, JJJJ-MM-TT) -

    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 auf Ihre Datentabelle basierend auf dem datetime-Teil:

       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) 
    

Warum Zahlen, keine Daten?

Einfach - Daten können basierend auf der Nummer generiert werden, wie in dem von mir bereitgestellten Beispiel. Es bedeutet auch, eine einzelne Tabelle zu verwenden, anstatt beispielsweise eine pro Datentyp.