我的表基本上是一个访问日志,记录每一页命中。我想要展示的是每年每周的点击次数,每年比较一次(所以我有2013年,2014年,2015年,2013年第2周,2014年等第1周)。我目前仅通过查询所有记录完成这一点,让PHP执行繁重的工作如下:按一年中的星期分组的计数记录
$result=$db->query("select `time` from accessTracking where `uID` is not null and `time`>1357030861 order by `time`");
foreach($result as $r){
$y=date("Y",$r['time']);
$w=ltrim(date("W",$r['time']),'0');
$accessArray[$w][$y]++;
}
虽然它的工作原理,它需要一个坚实的7秒加载它显示在图表上的页面,我想,PHP不仅有更好的方式,MySQL更是如此(这是我正在寻找的,但我会采取任何可以缩短页面加载时间并使整个事情更有效的方法。)
所以,就这样,我想出最好的是:
select weekofyear(`time`) as week, count(*) as count from `accessTracking` where `uID` is not null group by week
这看起来像它会工作,因为它返回53行,从1-52的“星期”列和“计数”列与他们的随机值范围从2到1100.问题是,数字应该是更高的方式因为我拥有的最高一周大约有27,000次点击,并且此查询中返回的第一条记录是一个空“周”值,“count”值约为398,000。这告诉我,对于大多数记录来说,它不计算weekofyear()值。
我的猜测是,我最终会将其作为每年的单独查询来运行,因为它可能太多以至于不能返回年份,周数和计数,所有这些都按照我想要的方式分组。但谁知道!
按年份添加额外的分组不应该“太多”,并且我相信您正在以正确的方式进行操作。尽管我对'weekofyear()'函数不太了解。 – shawnt00
Fred,表格没有被编入索引,但我不确定它在这里有多大的帮助,我们并没有真正地搜索或整理信息。每个记录都必须进行分析,然后进行排序。分页确实不是一种选择,因为最终结果集(用于显示数据的页面上)只是每年每周的记录数,而不是记录本身。因此,如果您想要显示最近三年的结果,则只能显示156条记录。那里没什么大不了的。 – Patrick
我删除了关于那个Patrick的评论;在你发表你的评论之前,我想到了很多并被删除了。请参阅下面给出的答案。但是,索引会帮助*一点*。 Gordon在SQL方面比我高得多。 –