2013-07-22 46 views
0

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

我想画期间对比访客数图。 请注意:此处指的是周,月,3个月,6个月,1年,2年。 期间将由用户从选择框中选择。 例如:当用户选择3周时,我需要构建每3周图的访问者数量。 enter image description here

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

(1)时间戳

(2)用户ID

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

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; 
    ............ 
+2

为什么你需要的不仅仅是一个查询多为周期选择? – 2013-07-22 03:57:56

+0

没有看到您现在正在触发的查询我们不能帮您 – peterm

+0

请检查我的更新 –

回答

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); 

输出示例:

 
| YEAR | TOTAL | 
---------------- 
| 2011 |  2 | 
| 2012 |  1 | 
| 2013 |  9 | 

| MONTH | TOTAL | 
----------------- 
|  2 |  1 | 
|  3 |  2 | 
|  5 |  1 | 

| DAY | TOTAL | 
--------------- 
| 20 |  1 | 
| 21 |  1 | 
| 22 |  1 | 

这里是SQLFiddle演示