Вам нужно создать вспомогательную таблицу и заполнить ее всеми датами от start
до end
, а затем просто LEFT JOIN
с этой таблицей:
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
В принципе, что вы
MySQL
- единственная важная система, которая не имеет возможности ее генерировать.
PostgreSQL
реализует специальную функцию generate_series
, чтобы сделать это , в то время как Oracle
и SQL Server
могут использовать рекурсию (CONNECT BY
и рекурсивную CTE
s соответственно).