Php 按一年中的周数对记录进行计数

Php 按一年中的周数对记录进行计数,php,mysql,Php,Mysql,我的表基本上是一个访问日志,记录每一个被点击的页面。我想显示的是一年中每一周的每周页面点击率,每年进行比较(因此我有2013年第1周、2014年、2015年、2013年第2周、2014年等)。我目前正在通过查询所有记录来完成这项工作,并让PHP完成如下繁重的工作: $result=$db->query("select `time` from accessTracking where `uID` is not null and `time`>1357030861 order by `t

我的表基本上是一个访问日志,记录每一个被点击的页面。我想显示的是一年中每一周的每周页面点击率,每年进行比较(因此我有2013年第1周、2014年、2015年、2013年第2周、2014年等)。我目前正在通过查询所有记录来完成这项工作,并让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行,其中“week”列为1-52,“count”列的随机值范围为2到1100。问题是这些数字应该更高,因为我拥有的最高一周的点击量约为27000次,而此查询中返回的第一条记录是一个带有“count”的空“week”值值约为398000。这告诉我,对于大多数记录,它不计算weekofyear()值


我的猜测是,我最终会将此作为每年的单独查询运行,因为让它返回年份、周数和计数可能太多了,所有这些都按我想要的方式分组。但是谁知道呢!

您的查询是不可比的。特别是,第一个查询有以下条件:

`time` > 1357030861
这表明
time
是unix时间。我建议您尝试:

select weekofyear(from_unixtime(`time`)) as week, count(*) as count
from `accessTracking`
where `uID` is not null and `time` > 1357030861
group by week;

首先,使用关键字或函数作为列名不是一个好主意,因为这会导致混乱和出现错误的风险(并且必须记住所有的“字符”)。我认为这会满足你的要求,但随着年份的增加,结果也会增加

select weekofyear(from_unixtime(`time`)) as wk,
       year(from_unixtime(`time`)) as yr,
       count(*) as ct
from `accessTracking`
where `uID` is not null
group by wk, yr
要对看到的奇怪结果进行故障排除,您应该查询特定记录并查看它们与聚合的匹配情况。例如:

select `time` as access_time
from `accessTracking`
where `uID` is not null and
      weekofyear(from_unixtime(`time`)) = 1 and
      year(from_unixtime(`time`)) = 2015

将该查询中的行数与聚合查询中的行数进行比较。它们应该匹配,如果不匹配,您可以更好地看到差异所在。当然,我建议选择一周中行数较少的行进行故障排除,或者选择显示您认为错误的结果的行。

不应该太多要按年份添加额外的分组,我相信您的方法是正确的。我对
weekofyear()了解不够
函数对此进行推测。Fred,该表没有编制索引,但我不确定它在这里是否有多大帮助,我们并没有对信息进行太多的搜索或排序。每个记录都必须进行分析,然后再进行排序。分页确实不是最终结果集的选项(用于显示数据的页面)只是每年每周的记录数,而不是记录本身。因此,如果你想显示过去三年的结果,你只能显示156条记录。这没什么大不了的。我删除了我对Patrick的评论;我也计算了这么多,在你发表评论之前就被删除了。请参阅下面给出的答案。不过,索引可能会有所帮助。Gordon在SQL方面比我先进得多。我同意,索引从来不会有什么坏处,我只是没有看到在这种特殊情况下有什么巨大的好处。感谢您的输入!不客气,谢谢。就是这样。查询可以在不到半秒钟的时间内完成并运行完毕。它根本没有通过“一年一周()"这似乎是正确的值类型。是的,
time
是一个unix时间戳。我甚至可以实现它,返回年份而不需要太多额外的时间。非常感谢Gordon!我同意关键字问题。不确定我的哈希标记在该查询中的位置,但我很早就遇到了麻烦。感谢提醒,a使用from_unixtime()函数时,您与Gordon处于同一轨道上。太好了。