我正在尝试创建一个显示过去30天的图表。我有查询,它正在工作,但由于我们刚刚开始,我们只有从今天开始的日期,我想做的是在过去的30天内返回日期,总数将为0。
有没有用MYSQL做这件事?我的当前查询。
SELECT COUNT(DISTINCT(sessionkey)) as total, stamp as day,
ROUND(UNIX_TIMESTAMP(stamp)/(60 * 60)) AS timekey
FROM analytics
WHERE stamp > date_sub(now(), interval 30 day)
GROUP BY timekey
您可以在MySQL中这样做,但这是不可取的。
解决方案是:
填充临时表格:
CREATE TEMPORARY TABLE last30days(
myday DATE);
在其中插入最后30天:
CREATE PROCEDURE last30DaysProc()
BEGIN
DECLARE v_i INT;
SET v_i=30;
WHILE(v_i>0) LOOP
INSERT INTO last30days(myday) VALUES (date_sub(NOW(), interval v_i days));
SET v_i=v_i-1;
END WHILE;
END;
CALL last30DaysProc();
然后将这个临时表与您的表连接起来,并执行计数:
SELECT
COUNT(DISTINCT(sessionkey)) as total,
a.myday as myday,
ROUND(UNIX_TIMESTAMP(stamp)/(60 * 60)) AS timekey
FROM last30days a
LEFT JOIN analytics b ON a.myday=b.stamp
WHERE myday > date_sub(now(), interval 30 day)
GROUP BY timekey;
我会在代码中这样做:在绘制数据时,生成计数为0的缺失日期可能会更短。
我会在php网站上这样做,它会更高效。如果计数小于30,您可以通过简单的foreach循环添加假数据。