MySQL检查3个或更多连续(特定)条目

Bar*_*tak 6 mysql database

我有一张桌子:

+------------+-----------------------------------------------------------------------------------+
| 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                                                                              |
+------------+-----------------------------------------------------------------------------------+
Run Code Online (Sandbox Code Playgroud)

我试图以最简单的方式确定(最好只使用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      |
+----+---------------+---------+--------+---------------------+----+------------+
Run Code Online (Sandbox Code Playgroud)

将返回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      |
+----+---------------+---------+--------+---------------------+----+------------+
Run Code Online (Sandbox Code Playgroud)

会回来的FALSE.是否可以通过简单的查询执行此操作,还是需要以某种脚本语言实现此检查?

编辑:我忘了提到这个查询必须限于某个user_id但我认为这不会是一个问题.

否则,甚至更好,是否可以计算符合此标准的记录数(即type = LOGIN_FAILED自上次以来存在多少连续记录type=LOGIN_SUCCESS)

And*_*ius 2

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'
Run Code Online (Sandbox Code Playgroud)

将获得自上次成功以来失败的数量。