【问题标题】:Count active users per hour based on two datetime entries根据两个日期时间条目计算每小时活跃用户数
【发布时间】: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 了解如何提高问题质量并获得更好答案的好地方。
  • 因此您只需要查询“更新”日期时间字段,因为即使新用户来了,它的条目也会使用“创建”日期时间以及在“更新”日期时间下的下一次更新中创建,所以现在您只需查询任何特定小时的“更新”日期时间。
  • 没问题,我已经更新问题了

标签: php mysql sql datetime


【解决方案1】:

所以您只需要查询“更新”日期时间字段,因为即使新用户来了,它的条目也会使用“已创建”日期时间以及在“更新”日期时间下的下一次更新中创建,所以现在您需要关注只会查询任何特定小时的“更新”日期时间。

SELECT COUNT(id) FROM TABLE_NAME
WHERE update_Field BETWEEN DATE(NOW() - INTERVAL 1 HOUR);

这是一个帮助您的示例查询,我现在没有架构来测试它。 以您的方式修改它并 如果它不起作用,请告诉我。

【讨论】:

  • 不完全。当用户连接到服务器时,创建的字段被设置一次。然后,当他们继续侦听时,对该行的每次连续更新都会导致更新字段在会话继续时被更新(名称中的线索)。因此,如果他们在 2016-03-21 15:00:00 收听,则反映在创建的字段中。但如果他们在 1 小时后仍在收听,则更新字段将显示为 2016-03-21 16:00:00
  • 然后我们可以在WHERE字段中添加OR子句,如WHERE update_Field BETWEEN DATE(NOW() - INTERVAL 1 HOUR) OR create_Field BETWEEN DATE(NOW() - INTERVAL 1 HOUR)
  • 我知道您来自 WHERE(小玩笑,抱歉),但该查询只能根据当前时间工作。我已经用我想出的东西更新了这个问题,但是我可以在其中使用 OR 子句来获得所需的结果吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-05-22
  • 2021-06-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-07-22
  • 1970-01-01
相关资源
最近更新 更多