6

次の表があります。

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

type = LOGIN_FAILテーブルの最後または最初から3 つ以上の連続するレコードがあるかどうかを、可能な限り簡単な方法で (できれば MySQL を使用して) 判断しようとしてtype = LOGIN_SUCCESSいます。

例えば

+----+---------------+---------+--------+---------------------+----+------------+
| 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)を数えることができます。

4

2 に答える 2

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'

最後の成功以降の失敗の量を取得します。

于 2012-07-21T13:35:14.473 に答える
2

これがあなたを助けることを願っています

SELECT IF(COUNT(a.id)>=3, TRUE, FALSE) AS fresult FROM last_login AS a, 
(
        SELECT COUNT( b.id ) AS cnt, MAX( b.id ) AS maxid FROM last_login AS b 
        WHERE b.login_type =  'LOGIN_SUCCESS' 
) AS c  

WHERE a.id>c.maxid OR c.cnt=0
GROUP BY a.login_type
于 2012-07-21T14:06:25.480 に答える