2016-04-26 33 views
1

好日子都在,我有一個MySQL表看起來像這樣:有效的方式來計算每個用戶消耗的時間系統

|Id |username   |timestamp    |timestring  | 
+---+-------------------+-----------------------+---------------+ 
|4 |user1    |2016-02-11 11:50:21 |20160211115021 | 
|3 |user3    |2015-12-04 15:55:46 |20151204155546 | 
|2 |user2    |2015-12-03 19:54:48 |20151203195448 | 
|1 |user1    |2015-11-27 10:24:30 |20151127102430 | 
+---+-------------------+-----------------------+---------------+ 

這說明一個互斥面板上的訪問日誌(只一個人每次都可以保持登錄狀態)。 我想要做的是有一些統計數據,其中大部分是非常直接的,但我在計算面板花費的時間有困難,我想知道每個用戶,他/她多少時間已經「封鎖」了系統。

實際上,我正在創建一個用戶名數組,其中我逐漸將用戶從「下一個」(由id獲取)的所有秒數加起來。

我覺得這對於系統來說是非常耗時的,我想有一個更有效的方法來做到這一點,有沒有辦法使用mySQL來獲得這個,或者更好地構建一個新表只需存儲所有用戶名並不時添加時間?或者更好地使用PHP?

我必須考慮mySQL是一個共享的,所以我的資源不是無限的。

回答

1

一般來說,我會創建一個子查詢,它使用id字段將自己的表連接到自己的表中,其中右側表的id大於左側的id,並從中獲取min(timestamp)右邊的桌子。在外部查詢只是總結差的2個時間戳之間:

select t.username, sum(t.endtime-t.starttime) as seconds 
from 
    (select t1.id, t1.username, t1.timestamp as starttime, min(t2.timestamp) as endttime 
    from yourtable t1 
    left join yourtable t2 on t1.id<t2.id 
    group by t1.id, t1.username, t1.starttime) t 
group by t.username 

如果你知道有ID字段沒有間隙,那麼你就可以簡化您的查詢:

select t1.username, sum(t2.timestamp-t1.timestamp) as second 
from yourtable t1 
left join yourtable t2 on t1.id+1=t2.id 
group by t1.username 
+0

看起來真的很好,我不能以任何方式去想它(我沒那麼有經驗,而且我至少可以做一些連接),我會試着去理解它的表現,但看起來非常整齊。 –

+0

@RickJames你的意思是第二個,因爲第一個仍然可以工作。而且我確實指出,第二種解決方案只有在ID中沒有缺口的情況下才能起作用。 – Shadow

+0

糟糕;你是對的。我會刪除我的評論。 –

相關問題