我们假设我有这个numrequest
表。它包含以下字段:id
,id_user
,time
(时间戳)
我想计算按周分组的特定$id_user
的记录
我知道如何计算记录一段时间。
$past=time()-$totalSecondsInAweek
$query='SELECT COUNT(1) as counta
from numrequest
WHERE time >'.$past.'
AND WHERE id_user='.$id_user;
但是如何做到这一点,因此自从关于特定$id_user
答案 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);
这将得到你想要的......