2012-07-21 50 views
6

我有如下表:MySQL的檢查3個或更多的連續(特定的)條目

+------------+-----------------------------------------------------------------------------------+ 
| 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),如果有3個或自上一次type = LOGIN_SUCCESS以來的更多連續記錄(自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記錄存在多少)

回答

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' 

將得到量自去年成功的失敗。

+0

由於這幾乎解決了這個問題:)這裏有一個當有表中沒有'LOGIN_SUCCESS'在所有的小問題。在這種情況下,它總是返回0.是否有可能的解決方法? – 2012-07-21 13:42:58

+1

別擔心,我知道了:)謝謝! :) – 2012-07-21 13:56:40

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