Du måste skapa en hjälptabell och fylla den med alla datum från start
för att end
, sedan bara LEFT JOIN
med den tabellen:
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
I grund och botten, vad du behöver här är en dummy rowsource.
MySQL
är det enda större systemet som saknar ett sätt att generera det.
PostgreSQL
implementerar en speciell funktion generate_series
för att göra det, medan Oracle
och SQL Server
kan använda rekursion (CONNECT BY
och rekursiv CTE
s, följaktligen).