MySQL heeft geen recursieve functionaliteit, dus je blijft achter met de NUMBERS-tabeltruc -
-
Maak een tabel die alleen oplopende getallen bevat - eenvoudig te doen met een 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;
-
Vul de tabel met:
INSERT INTO NUMBERS (id) VALUES (NULL)
...voor zoveel waarden als u nodig heeft.
-
Gebruik DATE_ADD om een lijst met datums samen te stellen, waarbij de dagen worden verhoogd op basis van de waarde NUMBERS.id. Vervang "2010-01-01" en "2010-03-01" door uw respectievelijke begin- en einddatums (maar gebruik hetzelfde formaat, JJJJ-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 op uw gegevenstabel op basis van het datetime-gedeelte:
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)
Waarom cijfers, geen datums?
Eenvoudig - datums kunnen worden gegenereerd op basis van het aantal, zoals in het voorbeeld dat ik heb gegeven. Het betekent ook het gebruik van één enkele tabel, in plaats van één per gegevenstype.