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).