Bạn sẽ cần tạo một bảng trợ giúp và điền vào đó tất cả các ngày từ start
đến end
, sau đó chỉ cần LEFT JOIN
với bảng đó:
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
Về cơ bản, những gì bạn cần ở đây là một nguồn hàng giả.
MySQL
là hệ thống chính duy nhất thiếu cách tạo ra nó.
PostgreSQL
triển khai một chức năng đặc biệt generate_series
để làm điều đó, trong khi Oracle
và SQL Server
có thể sử dụng đệ quy (CONNECT BY
và CTE
đệ quy s, theo đó).