Dovrai creare una tabella di supporto e riempirla con tutte le date da start
a end
, quindi solo LEFT JOIN
con quella tabella:
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
Fondamentalmente, ciò di cui hai bisogno qui è un file source fittizio.
MySQL
è l'unico grande sistema che non ha un modo per generarlo.
PostgreSQL
implementa una funzione speciale generate_series
per farlo, mentre Oracle
e SQL Server
può usare la ricorsione (CONNECT BY
e ricorsivo CTE
s, di conseguenza).