0

为了数据分析的目的,我正在练习绘制各种统计数据的图表。但我无法找到一种在后端触发多个mysql查询的有效方法。

我正在尝试绘制期间访客人数的关系图。请注意:这里的期间是指周、月、3 个月、6 个月、1 年、2 年。期间将由用户从选择框中选择。例如:当用户选择 3 周时,我需要构建每 3 周的访客数图。 在此处输入图像描述

我的数据库包含两列:对于每个站点命中,它记录:

(1)时间戳

(2)用户标识

如果我为每个选择选项多次触发查询,那么性能会很差。那么,如何有效地做到这一点?

UPD:当用户选择每 3 个月的统计数据时:

然后我将mysql查询触发为:

Select count(*) From stats_tab WHERE timestamp BETWEEN JAN  AND MAR;
Select count(*) From stats_tab WHERE timestamp BETWEEN APR AND JUN;
Select count(*) From stats_tab WHERE timestamp BETWEEN JUL AND SEP;
............

每个查询返回的每个计数都将是我的图表的 y 轴值

当用户每年选择统计数据时:然后我将 mysql 查询触发为:

    Select count(*) From stats_tab WHERE timestamp BETWEEN 2009 AND 2010;
    Select count(*) From stats_tab WHERE timestamp BETWEEN 2010 AND 2011;
    Select count(*) From stats_tab WHERE timestamp BETWEEN 2011 AND 2012;
    ............
4

1 回答 1

1

不要使用多个查询访问数据库。通过适当应用一个查询来获取所有GROUP BYWHERE

SELECT YEAR(timestamp) year, COUNT(*) total
  FROM stats_tab 
 WHERE timestamp BETWEEN NOW() - INTERVAL 3 YEAR AND NOW()
 GROUP BY YEAR(timestamp);

SELECT MONTH(timestamp) month, COUNT(*) total
  FROM stats_tab 
 WHERE timestamp BETWEEN NOW() - INTERVAL 6 MONTH AND NOW()
 GROUP BY MONTH(timestamp);

SELECT DAY(timestamp) day, COUNT(*) total
  FROM stats_tab 
 WHERE timestamp BETWEEN NOW() - INTERVAL 7 DAY AND NOW()
 GROUP BY DAY(timestamp);

样本输出:

| 年份 | 总计 |
----------------
| 2011 | 2 |
| 2012 | 1 |
| 2013 | 9 |

| 月 | 总计 |
-----------------
| 2 | 1 |
| 3 | 2 |
| 5 | 1 |

| 天 | 总计 |
---------------
| 20 | 1 |
| 21 | 1 |
| 22 | 1 |

这是SQLFiddle演示

于 2013-07-23T09:38:54.183 回答