U moet een hulptabel maken en deze vullen met alle datums vanaf start om te end , dan gewoon LEFT JOIN met die tafel:
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
Kortom, wat je hier nodig hebt, is een dummy rowsource.
MySQL is het enige grote systeem dat geen manier heeft om het te genereren.
PostgreSQL implementeert een speciale functie generate_series om dat te doen, terwijl Oracle en SQL Server kan recursie gebruiken (CONNECT BY en recursieve CTE s, dienovereenkomstig).