我一直在尝试提出一个查询来解决我的问题,这基本上就是我的架构
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/