MySQL nemá rekurzivní funkce, takže vám zbývá použít trik s tabulkou NUMBERS -
-
Vytvořte tabulku, která obsahuje pouze rostoucí čísla – snadno to uděláte pomocí 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;
-
Naplňte tabulku pomocí:
INSERT INTO NUMBERS (id) VALUES (NULL)
...pro tolik hodnot, kolik potřebujete.
-
Použijte DATE_ADD k vytvoření seznamu dat, zvýšením dnů na základě hodnoty NUMBERS.id. Nahraďte „2010-01-01“ a „2010-01-02“ příslušným datem zahájení a ukončení (použijte však stejný formát, RRRR-MM-DD HH:MM:SS). V tomto příkladu jsem odečetl hodnotu NUMBERS.id od CURRENT_DATE, abych získal seznam sekvenčních hodnot data za poslední týden -
SELECT x.dt FROM (SELECT DATE_SUB(CURRENT_DATE, INTERVAL (n.id - 1) DAY) AS dt FROM numbers n WHERE n.id <= 7 ) x
-
VLEVO PŘIPOJTE se k vaší tabulce dat na základě části data a času.
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
Proč čísla, ne data?
Jednoduché - data lze generovat na základě čísla, jako v příkladu, který jsem uvedl. Znamená to také použití jedné tabulky, řekněme jedné pro každý datový typ.
Dříve:
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))