Budete muset vytvořit pomocnou tabulku a vyplnit ji všemi daty od start
do end
, pak stačí LEFT JOIN
s tou tabulkou:
SELECT d.dt AS date,
COUNT(*) AS total,
SUM(attitude = 'positive') AS positive,
SUM(attitude = 'neutral') AS neutral,
SUM(attitude = 'negative') AS negative
FROM dates d
LEFT JOIN
messages m
ON m.posted_at >= d.dt
AND m.posted_at < d.dt + INTERVAL 1 DAYS
AND spam = 0
AND duplicate = 0
AND ignore = 0
GROUP BY
d.dt
ORDER BY
d.dt
V podstatě to, co zde potřebujete, je fiktivní zdroj řádků.
MySQL
je jediný hlavní systém, kterému chybí způsob, jak jej generovat.
PostgreSQL
implementuje speciální funkci generate_series
k tomu, zatímco Oracle
a SQL Server
může používat rekurzi (CONNECT BY
a rekurzivní CTE
s).