2014-09-22 32 views
2

我有一個記錄無效用戶登錄嘗試的表。每次進行無效嘗試時,用戶名,用戶IP,用戶電子郵件和時間/日期都存儲在數據庫中。MySQL在共享3列中的至少1列的時間段內統計多個條目

我想要做的是檢查是否在任何24小時的時間段內有相同的用戶超過X次無效嘗試。但是,用戶可以隨時更改電子郵件,用戶名或IP。所以,我需要檢查這三個字段中的任何一個是否相同。

例如:

所有這些將與SAME用戶匹配,因爲他們共享用戶ID,IP或電子郵件。然後,我需要輸出所有用戶ID,IP和電子郵件,以便我可以禁止任何符合這些條件的表中的用戶。

+0

如果'1.1.1'與所示的所有ID一致,則可以基於前三組IP地址。這似乎是與你發佈的所有內容唯一密切的關係。 – 2014-09-22 01:58:57

+0

謝謝。知識產權只是一個例子,實際上它們將是真實而且變化多端的。這些用戶仍然以某種方式連接,因爲每個用戶都共享一個ID,IP或一封電子郵件。即使id2和id5是相關的,因爲雖然它們不共享直接字段,但它們通過id4具有二階關係,等等。 – 2014-09-22 02:05:20

+0

啊,我明白了。是的,我可以看到戈登的答案如何解釋試圖解決問題的複雜性。這是一個頭部爆竹。 – 2014-09-22 02:07:39

回答

3

這太長了評論。

你有什麼是記錄之間的連接圖,邊緣是電子郵件,用戶名和IP。您需要遍歷此圖來查找連接的子圖。這是困難的。在你的例子中,例如,id2和id2已連接,但它們沒有共同的字段。

所以,你需要一個圖形行走算法。 MySQL沒有直接在SQL中支持這種算法的構造。你可以寫一個存儲過程來找到這樣的羣體,但是這是不是你可以用一個SQL語句做

編輯:

當我以前也遇到過這個問題,我已經使用SQL,反覆update陳述。這個想法是爲每個記錄分配遇到的最低用戶標識。

create table tgroup as 
    select t.*, id as grpid 
    from table t; 

update tgroup join 
     (select email, min(id) as minid 
     from tgroup t 
     group by email 
     ) tt 
     on tt.email = tgroup.email and 
      tt.minid < tgroup.id 
    set tgroup.id = least(tt.minid, tgroup.id); 

update tgroup join 
     (select ip, min(id) as minid 
     from tgroup t 
     group by ip 
     ) tt 
     on tt.ip = tgroup.ip and 
      tt.minid < tgroup.id 
    set tgroup.id = least(tt.minid, tgroup.id); 

然後您必須重複此操作,直到沒有更新。

+0

謝謝,這是有道理的。你會有什麼建議這樣的算法在PHP中?我正在想用數組的東西,但是我無法把頭繞在它的周圍。 – 2014-09-22 01:57:07

相關問題