MySQL n'a pas de fonctionnalité récursive, il vous reste donc à utiliser l'astuce de la table NUMBERS -
-
Créez une table qui ne contient que des nombres incrémentiels - facile à faire en utilisant 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;
-
Remplissez le tableau en utilisant :
INSERT INTO NUMBERS (id) VALUES (NULL)
...pour autant de valeurs que nécessaire.
-
Utilisez DATE_ADD pour construire une liste de dates, en augmentant le nombre de jours en fonction de la valeur NUMBERS.id. Remplacez "2010-01-01" et "2010-03-01" par vos dates de début et de fin respectives (mais utilisez le même format, AAAA-MM-JJ) -
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 sur votre table de données basée sur la partie datetime :
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)
Pourquoi des chiffres, pas des dates ?
Simple - les dates peuvent être générées en fonction du nombre, comme dans l'exemple que j'ai fourni. Cela signifie également utiliser une seule table, plutôt qu'une par type de données.