Musisz utworzyć tabelę pomocniczą i wypełnić ją wszystkimi datami od start
do end
, a następnie po prostu LEFT JOIN
z tą 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
Zasadniczo potrzebujesz tutaj fałszywego źródła danych.
MySQL
jest jedynym głównym systemem, w którym brakuje sposobu na jego wygenerowanie.
PostgreSQL
implementuje specjalną funkcję generate_series
aby to zrobić, podczas gdy Oracle
i SQL Server
może używać rekurencji (CONNECT BY
i rekurencyjne CTE
s, odpowiednio).