Você precisará criar uma tabela auxiliar e preenchê-la com todas as datas de
start
para end
, então apenas LEFT JOIN
com essa tabela: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
Basicamente, o que você precisa aqui é uma fonte de linha fictícia.
MySQL
é o único grande sistema que não tem uma maneira de gerá-lo. PostgreSQL
implementa uma função especial generate_series
para fazer isso, enquanto Oracle
e SQL Server
pode usar recursão (CONNECT BY
e recursiva CTE
s, em conformidade).