2015-02-24 93 views
0

使用PHP MySQL,我在數據庫中存儲了一個用戶的IP以及他們輸入的我的站點。該行看起來像:Mysql限制選擇不共用列的行

ip    entrypoint 
xxx.xxx.xxx.1 /index.php?source=google 
xxx.xxx.xxx.5 /other.php?source=bing 
xxx.xxx.xxx.5 /other.php?source=yahoo 
xxx.xxx.xxx.4 /more.php 

我試圖做一個查詢,從用戶從這樣來到這裏的表單和搜索我開始與這最多需要300個IP的(縮短爲僅顯示4):

SELECT entrypoint,ip from TABLE WHERE ip IN('xxx.xxx.xxx.1','xxx.xxx.xxx.5','xxx.xxx.xxx.5','xxx.xxx.xxx.4') AND entrypoint LIKE '%source=%'; 

這讓我像一個結果:

ip    entrypoint 
xxx.xxx.xxx.1 /index.php?source=google 
xxx.xxx.xxx.5 /other.php?source=bing 
xxx.xxx.xxx.5 /other.php?source=yahoo 

一些IP地址有因爲代理1000多個條目,機器人等等,所以我不能用自己的信息。如果給定IP有多個包含「source =」的「入口點」,我想忽略該行。它也使搜索大量的IP變得困難,因爲如果我正在搜索其中一個IP並返回與它相關的所有行,我將在PHP中耗盡內存。

而不是讓PHP做分揀共享IP的結果的工作,有沒有一種方法來編寫查詢,以便它不會返回任何「ip」,如果有多個值「入口點」?這是我想要它回來:

xxx.xxx.xxx.1 /index.php?source=google 

如果我用這些4 IP上面那些4行上運行它。由於xxx.xxx.xxx.5有兩個不同的入口點,我想忽略這些行。

+0

您不能找到一個現有的工具來做到這一點的數量,和?我不會重新發明輪子。谷歌分析? – Halfstop 2015-02-24 20:29:09

+1

用當前結果和預期結果表來說明你的問題? – Alex 2015-02-24 20:31:11

+0

Halfstop,我確實使用谷歌分析,這是針對邊緣情況。如果有幫助,你可以假裝我問的是狗的生日,而不是IP和他們的URL。 – 2015-02-24 20:43:32

回答

1

你應該通過IP您的結果分組,計算distincts入口點的返回那些與1個入口點

SELECT entrypoint,ip, count(distinct entrypoint) nb 
from TABLE WHERE ip 
     IN('xxx.xxx.xxx.1','xxx.xxx.xxx.5','xxx.xxx.xxx.5','xxx.xxx.xxx.4') 
AND entrypoint LIKE '%source=%' group by ip HAVING nb=1; 
+0

在這方面,nb是什麼意思?我在搜索時遇到麻煩。 – 2015-02-24 20:53:26

+0

「nb」是我給count()返回的列的別名。它代表「數字」,但您可以按照您喜歡的方式命名它 – Adam 2015-02-24 20:59:20