计算按周分组的记录

时间:2012-02-08 08:38:49

标签: php mysql

我们假设我有这个numrequest表。它包含以下字段:idid_usertime(时间戳)

我想计算按周分组的特定$id_user的记录 我知道如何计算记录一段时间。

  $past=time()-$totalSecondsInAweek

  $query='SELECT COUNT(1) as counta
          from numrequest
          WHERE time >'.$past.'
          AND WHERE id_user='.$id_user;

但是如何做到这一点,因此自从关于特定$id_user

的第一次输入以来每周计算一次

4 个答案:

答案 0 :(得分:2)

我的主要疑问,也可能与问题本身无关,你为什么要这样做?

  

$过去=时间() - $ totalSecondsInAweek   时间>'。$过去。'

您是否只尝试过去7天的记录?

如果是这种情况,请在您的sql代码中尝试:

WHERE time > date_sub(curdate(), INTERVAL 7 DAY)

在我的解决方案中,我将删除这个条件,因为我不理解它,我只是无法将它链接到按周分组。

现在,回答你的问题。我敢打赌,你不想只按周分组。您希望按对进行分组(年 - 周)。如果您不这样做,您将在第0周的两个日期分组:“2011-01-01”和“2012-01-01”。所以,我假设您希望以这种方式显示以前的数据:

Year | Week | Count(*)
----------------------
2011 | 0    | 1
2012 | 0    | 1

而不是:

Week | Count(*)
---------------
0    | 2

所以,这是SQL代码:

select
    id_user,
    year(time) as AYear, week(time) as AWeek,
    count(*) as TotalPerWeek
from n1
where id_user = 'tim'
group by id_user, AYear, AWeek
order by AYear, AWeek

这是example

如果您希望仅在一列中显示年份和周,则可以尝试此操作(我认为这将比CONCAT(年,周)更快):

select
    id_user,
    year(time) * 100 + week(time) as YearWeek,
    count(*) as TotalPerWeek
from n1
where id_user = 'tim'
group by id_user, YearWeek
order by YearWeek

这是example

注意:如果您希望您的周数从0开始,或者选择是在周一或周日开始,请查看官方documentation

希望这有帮助。

答案 1 :(得分:0)

你可以使用weekofyear功能。您的查询:

  $query='SELECT id_user, weekofyear(time) as `week`, COUNT(1) as counta
          from numrequest
          WHERE time >'.$past.'
          AND WHERE id_user='.$id_user.'
          GROUP BY id_user, weekofyear(time)';

您可以一次查询多个用户:

  $id_user = '1,2,3,4,5';
  $query='SELECT id_user, weekofyear(time) as `week`, COUNT(1) as counta
          from numrequest
          WHERE time >'.$past.'
          AND WHERE id_user in ('.$id_user.')
          GROUP BY id_user, weekofyear(time)';

答案 2 :(得分:0)

您必须将GROUP BY与2个谓词一起使用,即id_user最适合,时间字段使用WEEK()次幂:

SELECT id_user, COUNT(*) FROM numrequests WHERE time > some_date GROUP BY id_user, WEEK(time);

如果你为单个用户寻找结果,那么这是真的,如果你需要设置WHERE谓词

答案 3 :(得分:0)

$past=time()-$totalSecondsInAweek

$query='SELECT COUNT(1) as counta
      from numrequest
      WHERE time >'.$past.' AND id_user='.$id_user 
      GROUP BY WEEKOFYEAR(time);

这将得到你想要的......