使用mysql间隔获取按月分组的数据

使用mysql间隔获取按月分组的数据,mysql,Mysql,我希望从我的购买表中按月分组的过去1年的记录。值得一提的是,过去两个月内没有购买,包括当前购买。mysql查询如下 SELECT Year(purchasedate) as y ,Month(purchasedate) as m, Count(*) FROM purchase WHERE productid=1001 AND purchasedate >= CURDATE() - INTERVAL 1 YEAR GROUP BY m, y 它返回自上次购买日期起11个月的数据 2015

我希望从我的购买表中按月分组的过去1年的记录。值得一提的是,过去两个月内没有购买,包括当前购买。mysql查询如下

SELECT Year(purchasedate) as y ,Month(purchasedate) as m, Count(*) FROM purchase WHERE productid=1001 AND purchasedate >= CURDATE() - INTERVAL 1 YEAR GROUP BY m, y
它返回自上次购买日期起11个月的数据

2015 1 9177
2015 2 9914
2015 3 11672
2015 4 10521
2015 5 11873
2015 6 10449
2015 7 4057
2014 9 340
2014 10 9913
2014 11 8451
2014 12 7857
但它应该会返回12个月的数据

    2015 1 9177
    2015 2 9914
    2015 3 11672
    2015 4 10521
    2015 5 11873
    2015 6 10449
    2015 7 4057
    2015 8 0
    2015 9 0
    2014 10 9913
    2014 11 8451
    2014 12 7857
我做错了什么。提前谢谢。

试试这个

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

您没有做错任何事情,但MySQL无法返回数据集中数月内不存在的行。为了解决这个问题,您需要提供您自己的所有月份(此查询中的表
d
),并
使用您的数据集的结果将它们左连接起来
假设我有过去6年的数据,那么我的d表应该有6*12=72个条目,如(id y m)1 2009 1、2 2009 2、3 2009 3。。。。所以on@Alvi_1987,否,表
d
包含两个表
a
b
。现在,
a
列出了您想要的所有年份,
b
列出了所有可能的12个月。当前
a
仅返回2015年和2014年,如果您想添加更多年份,则只需在
a
的子查询中添加
UNION ALL选择2013作为y
,依此类推。
交叉连接将为您处理乘法运算