O MySQL não tem funcionalidade recursiva, então você fica usando o truque da tabela NUMBERS -
-
Crie uma tabela que contenha apenas números incrementais - fácil de fazer usando um 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;
-
Preencha a tabela usando:
INSERT INTO NUMBERS (id) VALUES (NULL)
...para quantos valores você precisar.
-
Use DATE_ADD para construir uma lista de datas, aumentando os dias com base no valor NUMBERS.id. Substitua "2010-01-01" e "2010-03-01" por suas respectivas datas de início e término (mas use o mesmo formato, AAAA-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 em sua tabela de dados com base na parte de data e hora:
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)
Por que números, não datas?
Simples - as datas podem ser geradas com base no número, como no exemplo que forneci. Isso também significa usar uma única tabela, em vez de uma por tipo de dados.