Php 确定用户何时处于活动状态的更好方法?
我有一个表,其中包含有关向我的网站发布消息的用户的信息。该表名为logs,具有以下记录:id、epoch、username、msg epoch是发布时的unix历元,msg是发布的消息 我决定把一天分成4段,每段6小时,分别为0-5、6-11、12-17、18-23 我想确定用户在每一段中发表的文章的百分比 有没有什么好方法可以只用一个sql查询就可以做到这一点?如果我必须对每个用户名进行4次如下的查询,那将花费很长时间Php 确定用户何时处于活动状态的更好方法?,php,mysql,Php,Mysql,我有一个表,其中包含有关向我的网站发布消息的用户的信息。该表名为logs,具有以下记录:id、epoch、username、msg epoch是发布时的unix历元,msg是发布的消息 我决定把一天分成4段,每段6小时,分别为0-5、6-11、12-17、18-23 我想确定用户在每一段中发表的文章的百分比 有没有什么好方法可以只用一个sql查询就可以做到这一点?如果我必须对每个用户名进行4次如下的查询,那将花费很长时间 SELECT count( num ) FROM `logs` WHERE
SELECT count( num )
FROM `logs`
WHERE username = 'bob'
AND from_unixtime( epoch )
BETWEEN date_sub( now( ) , INTERVAL 1 week )
AND now( )
AND hour( from_unixtime( epoch ) )
BETWEEN 0
AND 5
上面的查询告诉我bob在过去一周的0到5个小时内发了多少帖子。这感觉效率非常低,因为如果查询能够加载所有bob帖子,获取我需要的所有数据,然后返回这些数据,可能会更好;而不是必须加载他的职位5次不同的时间1得到总职位,2/3/4/5得到他的职位在特定的时间范围内
我的目标是在一个查询中获取bob发布的所有帖子,除以一天中的不同时间,即0小时和5小时、6小时和11小时、12小时和17小时、18小时和23小时。然后我可以将这些个人信息除以bob的总帖子数,例如bob在第6小时和第11小时发布了80%的帖子,等等
这样,我就可以准确地知道bob何时处于活动状态创建表bucketsint low,int hi;
将值0、5、6、11、12、17、18、23插入铲斗中;
选择'low','hi',count num
从'logs','bucket`
其中username='bob'
从下一个时代开始
现在的日期和时间间隔为1周
现在呢
从下一个纪元算起的时间
在“桶”和“低”之间`
还有“桶”。“嗨`
按“bucket”分组。“low”;
如果您希望同一查询也提供一整天的统计数据,那么除了其他四个值之外,还可以在bucket中插入0、23
更新:正如哈弗在评论中指出的那样,根据您的时间间隔,您也可以按小时分组第6部分:
选择从\u unixtime epoch div 6*6开始的小时,从\u unixtime epoch div 6*6+5开始的小时,count num
从`日志`
其中username='bob'
从下一个时代开始
现在的日期和时间间隔为1周
现在呢
从_unixtime epoch div 6开始按小时分组;
创建表扣为低,为高;
将值0、5、6、11、12、17、18、23插入铲斗中;
选择'low','hi',count num
从'logs','bucket`
其中username='bob'
从下一个时代开始
现在的日期和时间间隔为1周
现在呢
从下一个纪元算起的时间
在“桶”和“低”之间`
还有“桶”。“嗨`
按“bucket”分组。“low”;
如果您希望同一查询也提供一整天的统计数据,那么除了其他四个值之外,还可以在bucket中插入0、23
更新:正如哈弗在评论中指出的那样,根据您的时间间隔,您也可以按小时分组第6部分:
选择从\u unixtime epoch div 6*6开始的小时,从\u unixtime epoch div 6*6+5开始的小时,count num
从`日志`
其中username='bob'
从下一个时代开始
现在的日期和时间间隔为1周
现在呢
从_unixtime epoch div 6开始按小时分组;
相反,我会使用如下内容:
select count(msg) as TotalMsg,
sum(CASE WHEN (epoch MOD 86400)<21600 THEN 1 ELSE 0 END) as Period_1,
sum(CASE WHEN (epoch MOD 86400)>=21600 AND (epoch MOD 86400)<43200 THEN 1 ELSE 0 END) as Period_2,
sum(CASE WHEN (epoch MOD 86400)>=43200 AND (epoch MOD 86400)<64800 THEN 1 ELSE 0 END) as Period_3,
sum(CASE WHEN (epoch MOD 86400)>=64800 THEN 1 ELSE 0 END) as Period_4
from logs
where username='bob';
# 86400 = seconds in 24 hours
相反,我会使用如下内容:
select count(msg) as TotalMsg,
sum(CASE WHEN (epoch MOD 86400)<21600 THEN 1 ELSE 0 END) as Period_1,
sum(CASE WHEN (epoch MOD 86400)>=21600 AND (epoch MOD 86400)<43200 THEN 1 ELSE 0 END) as Period_2,
sum(CASE WHEN (epoch MOD 86400)>=43200 AND (epoch MOD 86400)<64800 THEN 1 ELSE 0 END) as Period_3,
sum(CASE WHEN (epoch MOD 86400)>=64800 THEN 1 ELSE 0 END) as Period_4
from logs
where username='bob';
# 86400 = seconds in 24 hours
您的解决方案是否完全使用PHP和MySQL,或者是否有HTML/Javascript的用户界面?您是否可以使用小时值整数div 6来给出0-3段数?这可能是GroupBy的基础。是的,我将使用HTML/Javascript。是的,我可以将小时数除以6,这很有效。你的解决方案是完全用PHP和MySQL,还是有HTML/Javascript的用户界面?你能用小时数整型div 6,给出一个0-3的段数吗?这可能是GroupBy的基础。是的,我将使用HTML/Javascript。是的,我可以把时间除以6,这也行