mysql - 递归时间查询

标签 mysql sql self-join

我一直在尝试提出一个查询来解决我的问题,这基本上就是我的架构

CREATE TABLE Attempts (
  `login` varchar(25) DEFAULT NULL,
  `date` datetime DEFAULT NULL,
  `success` tinyint(1) DEFAULT '0'
);

我的数据是这样的

_______________________________________
| login | date                |success|
+-------+---------------------+-------+
| user1 | 2017-12-12 12:00:00 | 0     |
| user1 | 2017-12-12 12:01:00 | 0     |
| user1 | 2017-12-12 12:03:00 | 0     |
| user1 | 2017-12-12 12:05:00 | 1     |
| user2 | 2017-12-12 12:00:00 | 0     |
| user2 | 2017-12-12 12:00:00 | 0     |
| user2 | 2017-12-12 12:00:00 | 0     |
+-------+---------------------+-------+

根据这些数据,我需要弄清楚用户是否曾在 15 分钟内尝试过 10 次或更多次失败。所以对于 2017-12-12 12:00:00 我需要 COUNT() 所有不成功的尝试直到 2017-12-12 12:15:00 对于 2017-12-12 12:01:00 我会计算所有尝试直到 2017-12-12 12:16:00

我试过自己加入

SELECT 
  a1.date, GROUP_CONCAT(a2.date)
FROM Attempts as a1
JOIN Attempts as a2
ON TIMESTAMPDIFF(MINUTE, a2.date, a1.date) BETWEEN 0 AND 15
GROUP BY a1.date;

但这似乎不正确,我觉得我过去已经解决了这个问题,而现在解决方案正在逃避我。

在此先感谢您的帮助

最佳答案

你很接近。使用您的方法:

SELECT a1.date, COUNT(*)
FROM Attempts a1 JOIN
     Attempts a2
     ON TIMESTAMPDIFF(MINUTE, a2.date, a1.date) BETWEEN 0 AND 15
WHERE a2.success = 0
GROUP BY a1.date
HAVING COUNT(*) >= 10;

编辑:

您似乎希望每次登录:

SELECT a1.login, a1.date, COUNT(*)
FROM Attempts a1 JOIN
     Attempts a2
     ON a1.login = a2.login and
        TIMESTAMPDIFF(MINUTE, a2.date, a1.date) BETWEEN 0 AND 15
WHERE a2.success = 0
GROUP BY a1.login, a1.date
HAVING COUNT(*) >= 10;

Here是 SQL fiddle 。

关于mysql - 递归时间查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47805376/

相关文章:

MySQL存储过程返回所有结果忽略WHERE子句

sql - Postgresql 递归自连接

MySQL查询问题

r - data.table 中更快的子集聚合

mysql - 无法查看全套 : Self Join - Compare where Column1 = and Column2 <>

c# - 是否可以从标量函数的结果为 Id 分配默认值

php - Magento安装问题

php - 如何从mysql中提取列名和php中的条目,列名只显示一次

php - 根据用户的兴趣显示出版物

sql - 如何在一条语句中查询三个表的sql?