2012-07-21 8 views
6

Ho una tabella seguente:MySQL Controllare 3 o più consecutivi (specifico) entries

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

che sto cercando di stabilire, nel modo più semplice possibile (preferibilmente usando solo MySQL), se ci sono 3 o più record consecutivi con type = LOGIN_FAIL dall'ultimo type = LOGIN_SUCCESS o dall'inizio della tabella.

Per esempio

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

sarebbe tornato TRUE mentre

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

sarebbe tornato FALSE. È possibile farlo con una semplice query o devo implementare questo controllo in qualche linguaggio di script?

MODIFICA: Ho dimenticato di dire che questa query dovrebbe essere limitata a un determinato user_id ma presumo che questo non sarebbe un problema.

In caso contrario, o meglio ancora, sarebbe possibile contare quanto i record si adattano a questa criteri (cioè quante esistono consecutivi type = LOGIN_FAILED record dallo scorso type=LOGIN_SUCCESS)

risposta

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' 

otterrà la quantità di esito negativo in quanto ultimo successo .

+0

Grazie questo quasi risolve il problema :) C'è solo un piccolo problema quando non ci sono 'LOGIN_SUCCESS' nella tabella a tutti. In tal caso restituisce sempre 0. C'è una possibile soluzione per questo? –

+1

Non preoccuparti, lo capisco :) Grazie! :) –

2

Spero che questo vi aiuterà 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 
Problemi correlati