我有一个下表:
+------------+-----------------------------------------------------------------------------------+
| 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_FAIL
自上次type = LOGIN_SUCCESS
或自表开始以来是否有 3 个或更多连续记录。
例如
+----+---------------+---------+--------+---------------------+----+------------+
| 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_FAILED
自 last 以来存在多少连续记录type=LOGIN_SUCCESS
)