【问题标题】:MySQL determine number of users in system hourly queryMySQL确定系统每小时查询中的用户数
【发布时间】:2013-07-16 21:55:19
【问题描述】:

我有一个应用程序使用以下审计表格式写入 MySQL。我需要确定在一天中的任何给定时间登录到系统的当前用户数。

我已经尝试过各种自联接、子查询、timediff,甚至转换为 unixtime 加上一些简单的数学,但是我无法提出一个可以接受的解决方案。
非常感谢任何指针或帮助。


审计表

user | action | time
-----|--------|------
  1  | login  | 2013-07-02 00:37:00
  2  | login  | 2013-07-02 00:38:00
  1  | logout | 2013-07-02 00:39:30
  3  | login  | 2013-07-02 00:40:00
  2  | logout | 2013-07-02 02:30:00


所需格式:一天 24 小时的小时 |在那一小时内登录的用户数
示例(请注意,用户 3 尚未注销,因此在第 3 小时的计数中仍显示为活动状态)

hour | usersloggedin
-----|---------------
  0  |  3
  1  |  2
  2  |  2
  3  |  1

【问题讨论】:

  • 请提供更多示例数据并始终发布您尝试过的内容。当我们使用您的示例数据时,当前的结果是每个用户都会落入 hour = 0 行。我认为用户可能有多个登录和注销?您是否以任何方式确定哪个登录属于哪个注销?

标签: mysql sql audit self-join


【解决方案1】:

在此之前,您需要创建一个名为 hours_table 的表,其编号从 00 到 23:

CREATE TABLE `hours_table` (`hour` char(2) DEFAULT NULL); 

hour
----
00
01
02
03
04
..

执行此查询后:

SELECT  hour, (count(DISTINCT(li.user)) - count(DISTINCT(lo.user))) AS usersloggedin  FROM hours_table    
LEFT JOIN audit_table AS li ON  DATE_FORMAT(li.time, '%Y%m%d%H')<=CONCAT('20130702',hour)  AND DATE_FORMAT(li.time, '%Y%m%d')='20130702' AND li.action='login'
LEFT JOIN audit_table AS lo ON  DATE_FORMAT(lo.time, '%Y%m%d%H')<CONCAT('20130702',hour)  AND DATE_FORMAT(lo.time, '%Y%m%d')='20130702' AND lo.action='logout' 
GROUP BY hour

如果您认为用户昨天登录今天处于活动状态,则您可以在格式 yyyymmdd 中删除 DATE_FORMAT(time, '%Y%m%d')='20130702' 代替 20130702。

【讨论】:

  • 我现在确实可以正确显示小时|usersloggedin,但登录用户的计数始终为 0。将您用于调试目的的相同的 2 个计数语句添加到 select 表明它们都总是 =1,这意味着我总是在结果中得到 1-1=0。
  • 我已经测试过,这种方法工作正常。请添加您的 sql 语法。
  • 与您在上面发布的语法完全相同。也许我的问题在于 hour_table,我创建并插入了值,但我的 0* 值仅显示为 1、2、3、4 而不是 00、01、02、03。尽管如此,这仍然应该允许任何小时 = 10 或更高的工作。我用它来插入,我假设它错了——插入 hours_table(小时)值(00)
  • 字段类型是char还是varchar?
  • char(2) 如上所述。它有效!对此感到抱歉,我尝试的任何其他日子都可以完美运行,除了示例中的具有登录/注销信息的那一天...不确定是怎么回事,可能是我的客户或大脑有问题,但其他日子都可以完美运行。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-10
  • 2023-03-31
  • 1970-01-01
  • 2013-01-19
相关资源
最近更新 更多