Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/58.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 确定用户何时处于活动状态的更好方法?_Php_Mysql - Fatal编程技术网

Php 确定用户何时处于活动状态的更好方法?

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

我有一个表,其中包含有关向我的网站发布消息的用户的信息。该表名为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 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,这也行