2012-07-21 10 views
6

tengo una tabla siguiente:MySQL Compruebe si hay 3 o más consecutivos (específico) entradas

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

Estoy tratando de determinar, de la manera más sencilla posible (preferiblemente justo usando MySQL), si hay 3 o más registros consecutivos con type = LOGIN_FAIL desde el último type = LOGIN_SUCCESS o desde el inicio de la tabla.

Por ejemplo

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

volvería TRUE mientras

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

volvería FALSE. ¿Es posible hacer esto con una simple consulta o necesito implementar esta verificación en algún lenguaje de script?

EDIT: me olvidó mencionar que esta consulta tendría que ser limitado a un cierto user_id pero supongo que esto no sería un problema.

De lo contrario, o mejor aún, ¿sería posible contar lo mucho que los registros se ajustan a este criterio (es decir, cuántos existen consecutivos type = LOGIN_FAILED registros desde el pasado type=LOGIN_SUCCESS)

Respuesta

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' 

conseguirá la cantidad de falla desde el último éxito .

+0

Gracias esta casi soluciona el problema :) Sólo hay un pequeño problema cuando no hay 'LOGIN_SUCCESS' en la tabla en absoluto. En cuyo caso, siempre devuelve 0. ¿Hay una solución posible para esto? –

+1

No se preocupe, lo entiendo :) ¡Gracias! :) –

2

Hope esto le ayudará a

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 
Cuestiones relacionadas