Ще трябва да създадете помощна таблица и да я попълните с всички дати от 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, съответно).