Vous devrez créer une table d'assistance et la remplir avec toutes les dates depuis le start pour end , puis juste LEFT JOIN avec ce tableau :
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
Fondamentalement, ce dont vous avez besoin ici est une source factice.
MySQL est le seul système majeur qui ne dispose pas d'un moyen de le générer.
PostgreSQL implémente une fonction spéciale generate_series pour ce faire, tandis que Oracle et SQL Server peut utiliser la récursivité (CONNECT BY et CTE récursif s, en conséquence).