有效地触发多个查询

时间:2013-07-22 03:56:28

标签: php mysql ajax

为了数据分析,我正在练习绘制各种统计数据的图表。但我无法找到在后端触发多个 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;
    ............

1 个答案:

答案 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 演示