mysql:返回用户在y时间内发出x个以上的请求

qij5mzcb  于 2021-06-18  发布在  Mysql
关注(0)|答案(3)|浏览(530)

如果我有一个从数据库返回的用户列表,是否可以过滤掉并返回在y时间内出现x次以上的用户?
下面是我想要完成的一个例子:

mysql> SELECT * FROM user_activity;
+----------+---------------------+
| username | created_at          |
+----------+---------------------+
| User A   | 2018-12-06 00:00:00 |
| User B   | 2018-12-06 00:00:00 |
| User B   | 2018-12-06 00:09:00 |
| User A   | 2018-12-06 00:11:00 |
+----------+---------------------+
4 rows in set (0.00sec)

在mysql中,如何返回 User B 因为这个用户在10分钟内出现了不止一次? User A 将从该结果中忽略,因为它们每10分钟只出现一次。

9gm1akwq

9gm1akwq1#

您需要一个聚合查询,带有 HAVING 子句根据用户的出现次数筛选用户。日期的过滤器转到 WHERE 条款。
下面的查询选择在给定时间后10分钟内至少有2个条目的所有用户 @report_date :

set @report_date = "2018-12-06 00:00:00";

SELECT username
FROM user_activity
WHERE created_at 
    BETWEEN DATE_ADD(@report_date, INTERVAL 10 MINUTE) 
    AND @report_date
GROUP BY username
HAVING COUNT(*) > 1
q1qsirdb

q1qsirdb2#

我会考虑使用 exists :
选择ua*

from user_activity ua
where (select count(*)
       from user_activity ua2
       where ua2.user_name = ua.user_name and
             ua2.created_at <= ua.created_at and
             ua2.created_at > ua.created_at - interval 10 minute
      ) > 1;

这种方法很灵活。你的问题通常是关于 n 一段时间内发生的事件。通常,我主张使用 exists 当有人想要一个单一的事件,但对于一般的问题, count(*) 是一个值得尊敬的方法。

ars1skjm

ars1skjm3#

SELECT
    DISTINCT a.username
FROM
    user_activity a
    INNER JOIN user_activity b ON (
            b.username = a.username
        AND b.created_at > a.created_at
        AND b.created_at <= DATE_ADD(a.created_at, INTERVAL 10 MINUTE)
    )

相关问题