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