MySQL har inte rekursiv funktionalitet, så du får använda tabelltricket NUMBERS -
-
Skapa en tabell som bara innehåller ökande siffror - lätt att göra med ett 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;
-
Fyll i tabellen med:
INSERT INTO NUMBERS (id) VALUES (NULL)
...för så många värden du behöver.
-
Använd DATE_ADD för att skapa en lista med datum, öka dagarna baserat på värdet NUMBERS.id. Ersätt "2010-01-01" och "2010-03-01" med dina respektive start- och slutdatum (men använd samma format, ÅÅÅÅ-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
-
LEFT JOIN till din datatabell baserat på datetime-delen:
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)
Varför siffror, inte datum?
Enkelt - datum kan genereras baserat på antalet, som i exemplet jag gav. Det innebär också att man använder en enda tabell, jämfört med säg en per datatyp.