2012-07-27 76 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)