我有下表:
+------------+-----------------------------------------------------------------------------------+
| Field | Type |
+------------+-----------------------------------------------------------------------------------+
| id | int(10) unsigned |
| type | enum('REGISTER','ACTIVATE','LOGIN_SUCCESS','LOGIN_FAIL','LOGOUT','LOCK','UNLOCK') |
| user_id | int(10) unsigned |
| mod_id | int(10) unsigned |
| date | timestamp |
| ip | int(10) unsigned |
| user_agent | text |
+------------+-----------------------------------------------------------------------------------+
我试图以最简单的方式(最好只使用 MySQL)确定自上次 type = LOGIN_SUCCESS< 以来是否有 3 条或更多连续的
或从表格开始。type = LOGIN_FAIL
记录
例如
+----+---------------+---------+--------+---------------------+----+------------+
| id | type | user_id | mod_id | date | ip | user_agent |
+----+---------------+---------+--------+---------------------+----+------------+
| 6 | LOGIN_SUCCESS | 3 | NULL | 2012-07-21 14:08:32 | 0 | agent |
| 7 | LOGIN_FAIL | 3 | NULL | 2012-07-21 14:08:32 | 0 | agent |
| 8 | LOGIN_FAIL | 3 | NULL | 2012-07-21 14:08:32 | 0 | agent |
| 9 | LOGIN_FAIL | 3 | NULL | 2012-07-21 14:08:32 | 0 | agent |
+----+---------------+---------+--------+---------------------+----+------------+
将返回 TRUE
而
+----+---------------+---------+--------+---------------------+----+------------+
| id | type | user_id | mod_id | date | ip | user_agent |
+----+---------------+---------+--------+---------------------+----+------------+
| 6 | LOGIN_FAIL | 3 | NULL | 2012-07-21 14:08:32 | 0 | agent |
| 7 | LOGIN_FAIL | 3 | NULL | 2012-07-21 14:08:32 | 0 | agent |
| 8 | LOGIN_SUCCESS | 3 | NULL | 2012-07-21 14:08:32 | 0 | agent |
| 9 | LOGIN_FAIL | 3 | NULL | 2012-07-21 14:08:32 | 0 | agent |
+----+---------------+---------+--------+---------------------+----+------------+
将返回 FALSE
。是否可以通过简单的查询来执行此操作,或者我是否需要使用某种脚本语言来执行此检查?
编辑:我忘了提及此查询必须限制为某个 user_id,但我认为这不会成为问题。
否则,甚至更好,是否可以计算有多少记录符合此条件(即自上次 type=LOGIN_SUCCESS
以来存在多少个连续的 type = LOGIN_FAILED
记录)
最佳答案
SELECT COUNT(*) FROM `table`
WHERE
id >
(IFNULL(
(SELECT id
FROM `table`
WHERE `type`='LOGIN_SUCCESS'
ORDER BY id DESC
LIMIT 1),0
)
AND `type`='LOGIN_FAIL'
将获得自上次成功以来的失败次数。
关于MySQL 检查 3 个或更多连续(特定)条目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11592503/