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;
-
Remplir le tableau en utilisant :
INSERT INTO `example`.`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-06-06" et "2010-06-14" 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-06-06', INTERVAL `n`.`id` - 1 DAY) FROM `numbers` `n` WHERE DATE_ADD('2010-06-06', INTERVAL `n`.`id` -1 DAY) <= '2010-06-14' ) x
-
LEFT JOIN sur votre table de données en fonction de la portion de temps :
SELECT `x`.`ts` AS `timestamp`, COALESCE(`y`.`score`, 0) AS `cnt` FROM (SELECT DATE_FORMAT(DATE_ADD('2010-06-06', INTERVAL `n`.`id` - 1 DAY), '%m/%d/%Y') AS `ts` FROM `numbers` `n` WHERE DATE_ADD('2010-06-06', INTERVAL `n`.`id` - 1 DAY) <= '2010-06-14') x LEFT JOIN TABLE `y` ON STR_TO_DATE(`y`.`date`, '%d.%m.%Y') = `x`.`ts`
Si vous souhaitez conserver le format de date, utilisez les Fonction DATE_FORMAT :
DATE_FORMAT(`x`.`ts`, '%d.%m.%Y') AS `timestamp`