sql >> Databáze >  >> RDS >> Mysql

Seskupení podle data, návratový řádek, i když nebyly nalezeny žádné záznamy

MySQL nemá rekurzivní funkce, takže vám zbývá použít trik s tabulkou NUMBERS -

  1. Vytvořte tabulku, která obsahuje pouze rostoucí čísla – snadno to uděláte 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. Naplňte tabulku pomocí:

    INSERT INTO NUMBERS
      (id)
    VALUES
      (NULL)
    

    ...pro tolik hodnot, kolik potřebujete.

  3. Použijte DATE_ADD k vytvoření seznamu dat, zvýšením dnů na základě hodnoty NUMBERS.id. Nahraďte „2010-01-01“ a „2010-03-01“ příslušným datem zahájení a ukončení (použijte však stejný formát, 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. VLEVO PŘIPOJTE se k vaší tabulce dat na základě části data a času:

       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) 
    

Proč čísla, ne data?

Jednoduché - data lze generovat na základě čísla, jako v příkladu, který jsem uvedl. Znamená to také použití jedné tabulky, řekněme jedné pro každý datový typ.




  1. Mysql ERROR 1241 (21000):Operand by měl obsahovat 1 sloupec(y)

  2. jak vybrat max. smíšeného sloupce string/int?

  3. Připojovací dotaz MySQL pomocí like?

  4. Více GROUP_CONCAT na různých polích pomocí MySQL