Anda harus membuat tabel pembantu dan mengisinya dengan semua tanggal dari start
ke end
, lalu LEFT JOIN
dengan tabel itu:
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
Pada dasarnya, yang Anda butuhkan di sini adalah sumber baris tiruan.
MySQL
adalah satu-satunya sistem utama yang tidak memiliki cara untuk menghasilkannya.
PostgreSQL
mengimplementasikan fungsi khusus generate_series
untuk melakukan itu, sementara Oracle
dan SQL Server
dapat menggunakan rekursi (CONNECT BY
dan CTE
rekursif s, sesuai).