2015-07-10 100 views
1

我有一个表格,其中包含有关将消息发布到我的网站的用户的信息。该表被命名为logs,并具有以下记录:id, epoch, username, msg(时期是当它们贴的Unix时间戳,MSG是张贴的消息)(0-确定用户何时处于活动状态的更好方法?

我已决定一天分为4段,每段6小时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 

上面的查询告诉我多少职位鲍勃小时0和5之间进行,从过去一周。这感觉非常低效,因为如果查询可以加载所有bobs文章,获取我需要的所有数据,然后返回,那可能会更好。而不是不得不加载他的帖子5次不同的时间(#1获得总帖子,#2/3/4/5在特定小时范围内获得他的职位)

我的目标是获得所有帖子bob has通过一天中的不同时间(即0至5小时,6小时和11小时,12小时和17小时,18小时和23小时)来确定。然后我就可以通过鲍勃员额总数除以该个人信息和例如看到鲍勃的帖子他的职位的80%,每小时6和11时,等

这样一来,我可以找出什么时候鲍勃活跃

+0

是您的解决方案完全在PHP和MySQL中,还是HTML/Javascript中有用户界面? – kevin628

+1

你可以做小时值integer-div 6,给一个0-3段号码吗?这可能是“GROUP BY”的基础。 – halfer

+0

是的,我打算使用HTML/JavaScript。是的,我可以把时间分成6,这也是有效的 – Jason

回答

3
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`; 

如果您想让相同的查询也为您提供整天的统计信息,除了其他四个值之外,还需要将(0, 23)插入存储桶中。

更新:由于halfer在评论中指出的,用你的时间间隔也可以只是按hour div 6

SELECT hour(from_unixtime(epoch)) div 6 * 6, hour(from_unixtime(epoch)) div 6 * 6 + 5, count(num) 
FROM `logs` 
WHERE username = 'bob' 
AND from_unixtime(epoch) 
BETWEEN date_sub(now() , INTERVAL 1 week) 
AND now() 
GROUP BY hour(from_unixtime(epoch)) div 6; 
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