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))