MySQL har inte rekursiv funktionalitet, så du får använda tabellen NUMBERS -
-
Skapa en tabell som bara innehåller ökande siffror – lätt att göra med ett 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;
-
Fyll i tabellen med:
INSERT INTO NUMBERS (id) VALUES (NULL)
...för så många värden du behöver.
-
Använd DATE_ADD för att skapa en lista med datum, öka dagarna baserat på värdet NUMBERS.id. Ersätt "2010-01-01" och "2010-01-02" med dina respektive start- och slutdatum (men använd samma format, ÅÅÅÅ-MM-DD HH:MM:SS). I det här exemplet subtraherade jag värdet NUMBERS.id från CURRENT_DATE för att få en lista med sekventiella datumvärden för den senaste veckan -
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 till din datatabell baserat på datetime-delen.
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
Varför siffror, inte datum?
Enkelt - datum kan genereras baserat på antalet, som i exemplet jag gav. Det innebär också att man använder en enda tabell, jämfört med säg en per datatyp.
Tidigare:
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))