1

我有一个使用以下审计表格式写入 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
4

1 回答 1

3

首先,您需要创建一个名为 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

代替 20130702 如果您认为用户昨天登录今天活跃,则您可以使用格式 yyyymmdd remove DATE_FORMAT(time, '%Y%m%d')='20130702' 代替 20130702。

于 2013-07-18T09:31:39.743 回答