2015-12-31 32 views
1

我試圖檢測使用代理濫用我的網站的人。使用MySQL計算IP地址列的變化

通常他們會改變代理等等。但是,他們肯定會多次使用一個代理地址。合法訪問者比正常人多得多。

通常我的網站最多訪問是由唯一訪問一次或幾次的唯一IP地址。不重複。

比方說,我在一列有這些IP地址:

89.46.74.56 
89.46.74.56 
89.46.74.56 
91.14.37.249 
104.233.103.6 

這將意味着有3個不重複滿分5分給予60%的「獨特性得分」。

我如何使用MySQL高效計算?

+0

您可以發佈樣本標籤結構和數據。與期望的輸出 – amdixon

+0

@amdixon好吧,我想我簡化了這個問題,並添加了一些示例數據:) –

+0

所以輸出:89.46.74.56 ..... 60%,91.14.37.249 ...... 20% ,104.233.103.6 ...... 20%? – amdixon

回答

2

計劃

  • 通過IP獲取計數分組
  • 除以(交叉連接)的總的行數
  • 採取最大重複率從上方

設置

create table example 
(
    id integer primary key auto_increment not null, 
    ip varchar(13) not null 
); 

insert into example 
(ip) 
values 
('89.46.74.56' ), 
('89.46.74.56' ), 
('89.46.74.56' ), 
('91.14.37.249' ), 
('104.233.103.6') 
; 

查詢

select max(repeat_factor) 
from 
(
select ip, count(*)/rc.row_count as repeat_factor 
from example 
cross join (select count(*) as row_count from example) rc 
group by ip 
) q 
; 

輸出

+--------------------+ 
| max(repeat_factor) | 
+--------------------+ 
| 0.6    | 
+--------------------+ 

sqlfiddle

+0

完美的作品 - 天才!有些人就像SQL一樣好......我向你投降。將接受,當它允許我:) –

+0

我應該提到,它是給出了我最初在問題(1-uniqueness_score)中提出的相反......但它們都是真的......我寫錯了一個問題,可以採取任何一種方式.....謝謝:) –

+1

沒有後顧之憂 - 很高興它適合你,有時這些統計'分數'之間的語義很難解釋 – amdixon