Sie müssen eine Hilfstabelle erstellen und diese mit allen Daten ab start
füllen zum end
, dann einfach LEFT JOIN
mit dieser Tabelle:
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
Im Grunde brauchen Sie hier eine Dummy-Rowsource.
MySQL
ist das einzige große System, das keine Möglichkeit hat, es zu generieren.
PostgreSQL
implementiert eine spezielle Funktion generate_series
um dies zu tun, während Oracle
und SQL Server
kann Rekursion verwenden (CONNECT BY
und rekursives CTE
s, entsprechend).