2015-07-10 53 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 
相關問題