【问题标题】:Show the last 30 days even if its not in the table显示过去 30 天,即使它不在表格中
【发布时间】:2015-06-26 00:50:56
【问题描述】:
我正在尝试创建一个显示过去 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
date
datetime
time
【解决方案1】:
您可以在 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;
我会在代码中执行此操作:在您绘制数据时生成 count=0 的缺失日期可能会更短。
【解决方案2】:
我会在 php 网站上这样做,它会更有效率。如果 count 小于 30 ,您可以通过简单的 foreach 循环添加假数据。