MySQL non ha funzionalità ricorsive, quindi ti resta l'utilizzo del trucco della tabella NUMBERS -
-
Crea una tabella che contenga solo numeri incrementali - facile da fare usando un 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;
-
Compila la tabella utilizzando:
INSERT INTO NUMBERS (id) VALUES (NULL)
...per tutti i valori di cui hai bisogno.
-
Usa DATE_ADD per costruire un elenco di date, aumentando i giorni in base al valore NUMBERS.id. Sostituisci "01-01-2010" e "01-03-2010" con le rispettive date di inizio e fine (ma usa lo stesso formato, AAAA-MM-GG) -
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
-
A SINISTRA UNISCITI alla tua tabella di dati in base alla parte data/ora:
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)
Perché i numeri, non le date?
Semplice:le date possono essere generate in base al numero, come nell'esempio che ho fornito. Significa anche utilizzare una singola tabella, invece di una per tipo di dati.