MySQL确定系统每小时查询的用户数

MySQL确定系统每小时查询的用户数,mysql,sql,audit,self-join,Mysql,Sql,Audit,Self Join,我有一个应用程序使用下面的审计表格式写入MySQL。我需要确定在一天中的任何给定时间登录到系统的当前用户数。我尝试了各种自连接、子查询、timediff,甚至转换为unixtime加上一些简单的数学运算,但是我无法想出一个可接受的解决方案

我有一个应用程序使用下面的审计表格式写入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小时的计数中仍显示active)


首先,您需要创建一个名为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
从小时表中选择小时(count(DISTINCT(li.user))-count(DISTINCT(lo.user)))作为用户

请以日期格式(li.time,“%Y%m%d%H”)将审核表左键作为li加入更多示例数据,并始终发布您尝试过的内容。当我们处理您的示例数据时,当前的结果是每个用户都会进入hour=0行。我假设一个用户有可能多次登录和注销?您是否以任何方式确定哪个登录属于哪个注销?我现在确实可以正确显示hour | usersloggedin,但登录用户的计数始终为0。添加用于调试目的的select的相同2个count语句时,我发现它们都始终=1,这意味着我在结果中总是得到1-1=0。我已经测试过,此方法工作正常。请添加您的sql语法。与上面发布的语法完全相同。也许我的问题在于hour_表,我创建并插入了值,但是我的0*值只显示为1,2,3,4,而不是00,01,02,03。不过,这应该仍然允许10小时或更高的时间工作。我用它来插入,我假设它是错误的——插入到hours_表(hour)values(00)字段类型是char还是varchar?char(2)正如您上面所说的。而且它有效!很抱歉,我尝试过的任何一天都很完美,除了示例中的一天,它有登录/注销信息。。。不知道发生了什么,可能是我的客户或大脑出了问题,但其他日子都很好。
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