MySQL няма рекурсивна функционалност, така че остава да използвате трика с таблицата NUMBERS -
-
Създайте таблица, която съдържа само нарастващи числа - лесно за изпълнение с помощта на 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;
-
Попълнете таблицата с помощта на:
INSERT INTO NUMBERS (id) VALUES (NULL)
...за толкова стойности, колкото са ви необходими.
-
Използвайте DATE_ADD за да създадете списък с дати, увеличавайки дните въз основа на стойността NUMBERS.id. Заменете „2010-01-01“ и „2010-03-01“ със съответните начални и крайни дати (но използвайте същия формат, ГГГГ-ММ-ДД) -
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 към вашата таблица с данни въз основа на частта дата и час:
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)
Защо числа, а не дати?
Просто - датите могат да се генерират въз основа на числото, както в примера, който предоставих. Това също означава използване на една таблица, в сравнение с една за тип данни.