【发布时间】:2016-03-21 03:29:05
【问题描述】:
我有一个 MySQL 查询问题。
在我的 Web 应用程序中,我将 Shoutcast 服务器上的活动侦听器记录在 MySQL 数据库表中,其中包括“created”(他们收听时的日期时间字段)和“updated”(最新时间的日期时间字段)服务器轮询 Shoutcast 服务器(每分钟)。另外,我还检索了监听会话的持续时间(以秒为单位),以及每个会话唯一的 uid(又名会话 id)。
我想做的是计算每小时的听众数量,例如 13:00 = 20 个听众,但我想不仅包括那些收听的人,因此“创建”日期时间字段,还包括任何仍在前一小时收听的听众,因此“更新”日期时间字段。
我需要什么查询来实现这一点。我一次只会产生 1 天的结果。
我了解它将如何使用类似于“COUNT(id) AS hits”和“GROUP BY”的内容,但我不确定如何考虑日期时间字段,因为“更新”日期时间字段会不断更新,只要用户还在听。部分用户可以持续收听 3 小时以上。
编辑
数据库架构的主要部分是:id (int 20), created (datetime), updated (datetime), uid (int 20), duration (int 10)。
期望的结果类似于:
(时间/点击次数)0900 => 10, 1000 => 15, 1100 => 5, 1200 => 8, 1300 => 25
等等……
这是我用来按国家/地区过滤结果的查询,它使用 group by 和 count():-
SELECT country, COUNT(id) AS hits FROM listeners_log WHERE YEAR(created) = YEAR(NOW()) AND MONTH(created) = MONTH(NOW()) AND duration >= 60
查询最后还添加了一个过滤器,用于过滤掉时长小于 60 秒的会话。
更详细地说,created 字段反映了用户连接/启动监听会话的时间。例如,他们在 2016-03-21 15:00:00 收听,这反映在创建的字段中。但如果他们在 1 小时后仍在收听,则更新字段将显示为 2016-03-21 16:00:00,但创建的字段将保持不变。
更新:
我想出了以下 SQL,但这仅计算初始连接,由 created 字段指示,如果用户从一小时到下一小时保持连接,则忽略。
SELECT HOUR(created), COUNT(id) AS hits FROM listeners_log WHERE DATE(created) = CURDATE() group by HOUR(created)
【问题讨论】:
-
您能否为您希望运行查询的表提供架构?另外,您是否有任何疑问,您已经尝试过让我们帮助调试?
-
我们需要 db 模式样本数据和期望输出。请阅读How-to-Ask 这里是START 了解如何提高问题质量并获得更好答案的好地方。
-
因此您只需要查询“更新”日期时间字段,因为即使新用户来了,它的条目也会使用“创建”日期时间以及在“更新”日期时间下的下一次更新中创建,所以现在您只需查询任何特定小时的“更新”日期时间。
-
没问题,我已经更新问题了