MySQL no tiene funcionalidad recursiva, por lo que te queda usar el truco de la tabla NUMBERS -
-
Cree una tabla que solo contenga números incrementales, fácil de hacer usando un auto_incremento:
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;
-
Complete la tabla usando:
INSERT INTO NUMBERS (id) VALUES (NULL)
...para tantos valores como necesites.
-
Use DATE_ADD para construir una lista de fechas, aumentando los días según el valor de NUMBERS.id. Reemplace "2010-01-01" y "2010-01-02" con sus respectivas fechas de inicio y finalización (pero use el mismo formato, AAAA-MM-DD HH:MM:SS). En este ejemplo, resté el valor NUMBERS.id de CURRENT_DATE para obtener una lista de valores de fecha secuencial para la última semana -
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 en su tabla de datos según la porción de fecha y hora.
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
¿Por qué números, no fechas?
Simple:las fechas se pueden generar en función del número, como en el ejemplo que proporcioné. También significa usar una sola tabla, en vez de una por tipo de datos.
Anteriormente:
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))