2012-07-27 40 views
0

我有一個表格:userid時間戳每次用戶打開一個頁面時會插入一個新字段。mysql得到小時/分鐘/秒的總和

我試圖得到小時總量/分鐘//周出現在爲多個用戶1個月的間隔

我試了一堆不同的查詢,但每個都結束了非常低效率。

理想情況下,我想喜歡的東西來結束:

userid | minutes | hours | days | weeks 
     1  10080  168  7  1 
     2  1440  24  1  0 

希望有人可以闡明如何做到這一點一些輕。

下面是我試過的查詢:

SELECT 
    w.time AS `week`, 
    d.time AS `day`, 
    h.time AS `hour`, 
    m.time AS `minutes` 
    FROM (
      SELECT 
      SUM(t.time) AS `time` 
      FROM (
        SELECT 
        COUNT(DISTINCT WEEK(`timestamp`)) AS `time` 
       FROM table 
        WHERE 
        userid = "1" 
        AND 
        `timestamp` > DATE_SUB(NOW() , INTERVAL 1 MONTH) 
        GROUP BY MONTH(`timestamp`) 
        ) t 
     ) w, 
     (
      SELECT 
      SUM(t.time) AS `time` 
      FROM (
        SELECT 
        COUNT(DISTINCT DAY(`timestamp`)) AS `time` 
        FROM table 
        WHERE 
        userid = "52" 
        AND 
        `timestamp` > DATE_SUB(NOW() , INTERVAL 1 MONTH) 
        GROUP BY MONTH(`timestamp`) 
      ) t 
      ) d, 
     (
     SELECT 
      SUM(t.timestamp) AS `time` 
      FROM (
       SELECT 
        COUNT(DISTINCT HOUR(`timestamp`)) AS `time` 
        FROM table 
        WHERE 
        userid = "1" 
        AND 
        `timestamp` > DATE_SUB(NOW() , INTERVAL 1 MONTH) 
       GROUP BY DAY(`timestamp`) 
       ) t 
      ) h, 
     (
      SELECT 
      SUM(t.timestamp) AS `time` 
      FROM (
       SELECT 
        COUNT(DISTINCT MINUTE(`timestamp`)) AS `time` 
       FROM table 
       WHERE 
        userid = "1" 
       AND 
        `timestamp` > DATE_SUB(NOW() , INTERVAL 1 MONTH) 
        GROUP BY HOUR(`timestamp`) 
      ) t 
     ) m 

似乎非常過分的這個任務,也許有人有更好的東西?

+0

你試過什麼疑問?我很難理解你的源數據。 – 2012-07-27 03:43:25

+0

'效率低下' - 你如何衡量效率? – zerkms 2012-07-27 03:44:28

+0

我剛剛考慮問題並創建了一些奇怪的查詢。對不起,我沒有打擾他們添加他們,因爲他們是異乎尋常的 – Corey 2012-07-27 04:23:15

回答

1

我不清楚你想要什麼「總數」。

如果您想確定用戶是否在一個月內的任何給定分鐘有「打」(或任何它正在存儲在表中的交易)),然後您要計算「分鐘週期」在一個月內,用戶有一擊:

SELECT t.userid 
     , COUNT(DISTINCT DATE_FORMAT(t.timestamp,'%Y-%m-%d %H:%i')) AS minutes 
     , COUNT(DISTINCT DATE_FORMAT(t.timestamp,'%Y-%m-%d %H' )) AS hours 
     , COUNT(DISTINCT DATE_FORMAT(t.timestamp,'%Y-%m-%d'  )) AS days 
     , COUNT(DISTINCT DATE_FORMAT(t.timestamp,'%X-%V'  )) AS weeks 
FROM mytable t 
WHERE t.timestamp >= '2012-06-01' 
    AND t.timestamp < '2012=07-01' 
GROUP BY t.userid 

這是什麼東西做的是每個時間戳,並把它變成一個‘水桶’,由斬去秒,斬去分鐘,斬去時間等。

基本上,我們取一個時間戳(例如'2012-07-25 23:15:30')並將其分配給

minute '2012-07-25 23:15' 
hour '2012-07-25 23' 
day '2012-07-25' 

'2012-07-25 23:25:00'時間戳會得到分配給

minute '2012-07-25 23:25' 
hour '2012-07-25 23' 
day '2012-07-25' 

然後我們經歷並計算不同的桶數,我們分配了一個時間戳。如果這是該用戶在本月的所有匹配,那麼查詢將返回2分鐘,1爲所有其他期間計數。

對於用一個月內單發命中一個用戶,所有該用戶的計數將是1

對於具有完全相同分鐘內的所有「點擊」用戶,查詢將再次爲所有計數返回1。 (對於在一個月內沒有「點擊次數」的用戶,將不會返回任何行(如果您想返回零次數,您需要加入另一個行源以獲取用戶列表)。)

對於在一天內每秒有「命中」的用戶,此查詢將返回類似於您的示例中針對用戶ID 2顯示的計數。

該結果集爲您提供了一個月的用戶活動指示......用戶活躍一個月內的多少「分鐘時間段」。

「天」可能返回的最大值將是該月的天數。要返回「小時」的最大可能值將是該月份的天數的24倍。返回「分鐘」的最大可能值將是該月中的天數的1440倍。

但是,再次,我不完全清楚你想要返回的結果集。但是,這似乎是比之前「選擇」答案更合理的結果集。

+0

完美並且很好的解釋,用戶活動正是我想要達到的目標,我很抱歉沒有很好地解釋我自己。 – Corey 2012-07-27 05:59:33

+0

@Corey:當我第一次看到你的問題時,這就是我想你想要的,然後我看到了選擇的答案,而我是「WAT?」,然後我完全糊塗了。我認爲的另一種可能性是,你可能想知道最大值爲24的「小時」......每天活躍的用戶,但只在下午5點到6點之間,他們會得到1的計數。認爲你可以看到如何擴展相同的DATE_FORMAT方法來獲取,通過省略一天的部分...) – spencer7593 2012-07-27 06:05:49

1
SELECT userid, SUM(MINUTE(timestamp)) AS minutes, SUM(MINUTE(timestamp))/60 AS hours, SUM(MINUTE(timestamp))/(60*24) AS days, SUM(MINUTE(timestamp))/(60*24*7) AS weeks 
FROM Table 
GROUP BY userid 

如果有必要,如果需要整數,則使用ROUND(SUM(MINUTE(timestamp)), 0)