Du skal oprette en hjælpetabel og udfylde den med alle datoer fra start til end , og derefter LEFT JOIN med den tabel:
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
Grundlæggende er det, du har brug for her, en dummy rowsource.
MySQL er det eneste større system, der mangler en måde at generere det på.
PostgreSQL implementerer en speciel funktion generate_series at gøre det, mens Oracle og SQL Server kan bruge rekursion (CONNECT BY og rekursiv CTE s, i overensstemmelse hermed).