每次用户打开页面时,我都会有一个表格,其中包含:用户ID 和时间戳。
我正在努力获得出现的小时 / 分钟 / 天 / 周的总量多个用户的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 :(得分: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)
。
答案 1 :(得分: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倍。
但同样,我不清楚你想要回归的结果集。但这似乎是一个比以前“选择”的答案更合理的结果集。