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

标签 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                                                                              |
+------------+-----------------------------------------------------------------------------------+

我试图以最简单的方式(最好只使用 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/

相关文章:

sql - PostgreSQL 中的 CAST

mysql - mysql表id的默认值

php - 以一种无痛的方式从 mysql 转到 mysqli

php - MySQL 查询问题 - 连接和分组

mysql - 如何在 MySQL 中按日期分组?

sql - 以国家为列的数据库中的规范化

mysql - 删除一条记录导致另一个表中的记录丢失

mysql - 无法将数据从 Cassandra 导出到 MySql

进程列表中的 mysql 进程仍然存活

mysql - 我应该将字段 PRICE 作为 int 还是作为 float int 存储在数据库中?