Thử cái này
SELECT d.y, d.m, p.cnt
FROM
(SELECT a.y, b.m
FROM (SELECT 2015 AS Y UNION ALL SELECT 2014 AS Y) a
CROSS JOIN (SELECT 1 AS m UNION ALL SELECT 2 AS m UNION ALL SELECT 3 AS m UNION ALL SELECT 4 AS m UNION ALL SELECT 5 AS m UNION ALL SELECT 6 AS m UNION ALL SELECT 7 AS m UNION ALL SELECT 8 AS m UNION ALL SELECT 9 AS m UNION ALL SELECT 10 AS m UNION ALL SELECT 11 AS m UNION ALL SELECT 12 AS m) b
WHERE CONCAT(a.y, '-', b.m, '-01') BETWEEN CURDATE() - INTERVAL 13 MONTH AND CURDATE() - INTERVAL 1 MONTH
ORDER BY 1, 2) d
LEFT OUTER JOIN
(SELECT YEAR(purchasedate) AS Y ,MONTH(purchasedate) AS m, COUNT(*) cnt FROM purchase WHERE productid=1001 AND purchasedate >= CURDATE() - INTERVAL 1 YEAR GROUP BY m, Y) p ON d.m=p.m AND d.y=p.y
ORDER BY 1 DESC, 2
Bạn không làm gì sai, nhưng MySQL không thể trả về các hàng trong nhiều tháng không tồn tại trong tập dữ liệu của bạn. Để giải quyết vấn đề này, bạn cần cung cấp tất cả các tháng của bản thân (bảng d
trong truy vấn này) và LEFT JOIN
chúng với kết quả từ tập dữ liệu của bạn