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-01-02» на соответствующие даты начала и окончания (но используйте один и тот же формат: ГГГГ-ММ-ДД ЧЧ: ММ: СС).В этом примере я вычел значение NUMBERS.id из CURRENT_DATE, чтобы получить список последовательных значений даты за последнюю неделю -
SELECT x.dt
FROM (SELECT DATE_SUB(CURRENT_DATE, INTERVAL (n.id - 1) DAY) AS dt
FROM numbers n
WHERE n.id <= 7 ) x
LEFT JOIN на таблицу данныхна части даты и времени.
SELECT x.dt,
COUNT(v.aid) AS num
FROM (SELECT DATE_SUB(CURRENT_DATE, INTERVAL (n.id - 1) DAY) AS dt
FROM numbers n
WHERE n.id <= 7 ) x
LEFT JOIN VOTES v ON DATE(FROM_UNIXTIME(v.timestamp)) = DATE(x.dt)
GROUP BY x.dt
ORDER BY x.dt
Почему числа, а не даты?
Простой - даты могут быть сгенерированы на основе числа, как в приведенном мной примере.Это также означает использование одной таблицы, например, по одной для каждого типа данных.
Ранее:
SELECT DATE(FROM_UNIXTIME(v.timestamp)) AS dt,
COUNT(v.aid)
FROM VOTES v
WHERE DATE(FROM_UNIXTIME(v.timestamp)) BETWEEN DATE_SUB(CURRENT_DATE, INTERVAL 7 DAY)
AND CURRENT_DATE
GROUP BY DATE(FROM_UNIXTIME(v.timestamp))