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

时间:2015-07-10 23:49:34

标签: 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 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小时之间发了多少帖子。这感觉非常低效,因为如果查询可以只加载所有bobs帖子,获取我需要的所有数据,然后返回它,那可能会更好;而不是必须加载他的帖子5次不同(#1获得总帖子,#2 / 3/4/5在特定小时范围内获得他的帖子)

我的目标是获取bob在一个查询中所做的所有帖子,除以一天中的不同时间(即0到5小时,小时6和11,小时12和17,小时18和23)。然后我可以通过bobs总帖子来划分这些个人信息,例如看到bob在第6和第11小时发布了80%的帖子等等

通过这种方式,我可以确切了解bob何时处于活动状态

2 个答案:

答案 0 :(得分:3)

cvlc -vvv stream:///rtsp://0.0.0.0:8554/}'  --sout=file/ps:record.mpg

如果您希望相同的查询也为您提供整天的统计信息,请将create table buckets(int low, int hi); insert into buckets values(0, 5), (6, 11), (12, 17), (18, 23); SELECT `low`, `hi`, count( num ) FROM `logs`, `buckets` WHERE username = 'bob' AND from_unixtime( epoch ) BETWEEN date_sub( now( ) , INTERVAL 1 week ) AND now( ) AND hour( from_unixtime( epoch ) ) BETWEEN `buckets`.`low` AND `buckets`.`hi` GROUP BY `buckets`.`low`; 插入到存储桶中以及其他四个值。

更新:正如评论中指出的halfer,您的时间间隔也可以按(0, 23)分组:

hour div 6

答案 1 :(得分:1)

我会改用这样的东西:

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