mysql - 按INTERVAL分组1小时(检测可疑批量登录)

时间:2018-05-07 22:09:31

标签: mysql date datetime

我想知道哪些用户在一小时的窗口中登录最多。我将所有活动记录在名为user_activity的表格中,该表格包含event_classtimestampuser_id列(其他列存在,但不重要)。当用户登录时,LOGIN事件类与CURRENT_TIMESTAMP一起写入user_id

当我在一个小时左右的时间内看到数百个login事件时,服务器运行竞争性大学事件注册并且学生CAPTCHA求解器(Python / OpenCV2 ...)已被捕获(见下文)。我制作了一个脚本,暂时禁止用户在过去十分钟内登录超过5次,这很简单。

我现在想要搜索历史记录,以查看每小时窗口每个登录用户的总计数。伪说话:" select each user_id from user_activity and group by total logins per last interval 1 hour"所以我可以快速查看哪些用户和IP地址(未显示)快速登录。可以这样做吗?

示例" Sean"在我们禁止他之前的最后30次登录

+---------+-------------+---------------------+ | user_id | event_class | timestamp | +---------+-------------+---------------------+ | 617 | LOGIN | 2018-05-01 21:46:20 | | 617 | LOGIN | 2018-05-01 20:48:55 | | 617 | LOGIN | 2018-05-01 20:45:01 | | 617 | LOGIN | 2018-05-01 20:43:41 | | 617 | LOGIN | 2018-05-01 20:42:06 | | 617 | LOGIN | 2018-05-01 20:37:19 | | 617 | LOGIN | 2018-05-01 20:32:31 | | 617 | LOGIN | 2018-05-01 20:27:17 | | 617 | LOGIN | 2018-05-01 20:26:21 | | 617 | LOGIN | 2018-05-01 20:25:44 | | 617 | LOGIN | 2018-05-01 20:24:08 | | 617 | LOGIN | 2018-05-01 20:20:44 | | 617 | LOGIN | 2018-05-01 20:16:59 | | 617 | LOGIN | 2018-05-01 18:23:44 | | 617 | LOGIN | 2018-05-01 13:01:14 | | 617 | LOGIN | 2018-05-01 12:55:12 | | 617 | LOGIN | 2018-05-01 12:47:58 | | 617 | LOGIN | 2018-04-30 16:09:51 | | 617 | LOGIN | 2018-04-30 15:38:22 | | 617 | LOGIN | 2018-04-30 15:37:31 | | 617 | LOGIN | 2018-04-30 15:36:20 | | 617 | LOGIN | 2018-04-30 15:35:33 | | 617 | LOGIN | 2018-04-30 15:34:08 | | 617 | LOGIN | 2018-04-30 15:31:46 | | 617 | LOGIN | 2018-04-30 15:24:33 | | 617 | LOGIN | 2018-04-30 15:23:22 | | 617 | LOGIN | 2018-04-30 15:20:27 | | 617 | LOGIN | 2018-04-30 15:09:49 | | 617 | LOGIN | 2018-04-30 15:05:59 | | 617 | LOGIN | 2018-04-30 15:00:03 | +---------+-------------+---------------------+

1 个答案:

答案 0 :(得分:0)

当然,您只需选择所需的数据并按此分组:

SELECT
    user_id,
    CONCAT(DATE(`timestamp`), ' ', HOUR(`timestamp`)) AS datehour,
    COUNT(1) AS logins
FROM user_activity
WHERE event_class = 'LOGIN'
GROUP BY user_id, datehour
HAVING logins > 5

在这里,我们应该看到每个用户每小时登录超过5次的行。这里唯一需要注意的是,这是每小时所以如果他们在晚上10:59登录3次,在晚上11:01登录3次,他们在任何特定时间内都不会超过3次