Versuchen Sie dies
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
Sie machen nichts falsch, aber MySQL kann keine Zeilen für Monate zurückgeben, die in Ihrem Datensatz nicht vorhanden sind. Um dieses Problem zu lösen, müssen Sie alle Monate selbst angeben (Tabelle d
in dieser Abfrage) und LEFT JOIN
sie mit Ergebnissen aus Ihrem Datensatz