2010-03-02 34 views
12

如何通過PHP格式化MySQL數據庫上的查詢以查找IP地址是否落在兩個不同字段中的兩個數字之間?查找數字是否在MySQL數據庫的不同字段中的兩個數字之間

IP地址的數值表示發現:

1265631252 

數據庫格式:

IP FROM  IP TO  REGISTRY ASSIGNED CTRY CNTRY COUNTRY 
"1265631232","1265893375","arin","1152835200","US","USA","United States" 
"1265893376","1265958911","arin","1149120000","US","USA","United States" 
"1265958912","1266024447","arin","1149120000","US","USA","United States" 
"1266024448","1266089983","arin","1162425600","US","USA","United States" 
+0

也許「分而治之」的方法可能會更好?將ip地址分割成smallint(字節)的4個字段,把這些字段放在一個索引中(這部分很重要),然後在單獨的條件(如地址127.0.0.1或調整範圍)中查詢這些字段:where(fld1 (fld1 <= 127)和(fld1 <= 127)且(fld2> = 0)且(fld2 <= 0)且(fld3> = 0)且(fld3 <= 0) = 1)。沒有嘗試過,只是一個想法嘗試。 – 2015-06-05 08:38:36

回答

32

這樣的查詢:

SELECT * FROM your_table WHERE 1265631252 BETWEEN `IP FROM` AND `IP TO`; 

將返回該行(S)提供的號碼在IP FROMIP TO之間。

+2

在我的測試中(MySQL),做類似的IP地址查找,這個「之間」的版本是這個版本(80-83毫秒)的2倍慢(160-170毫秒)「select * from your_table where ip_from <= 1265631252 and ip_to > = 1265631252;「。在ip_from上建立的主鍵和建立在ip_to上的唯一索引在測試時已就位。 – 2013-11-24 03:50:26

1

什麼是這樣的:

select * 
from your_table 
where ip_from <= '1265631252' 
    and ip_to >= '1265631252' 

即得到所有針對 '1265631252' 是ip_fromip_to之間的界限?

3

如果你已經有了IP地址的DWORD等價物,那麼response from Jordan就可以做到。

SELECT * FROM your_table WHERE 1265631252 BETWEEN `IP FROM` AND `IP TO`; 

如果您需要,在執行查詢之前,計算ip地址的DWORD等效值,您可以執行以下操作。

在那麼DWORD相當於可以用下面的公式計算形式part1.part2.part3.part4在給定IP地址a

dword(a) = ((a.part1 * 256 + a.part2) * 256 + a.part3) * 256 + a.part4 

,然後你可以在SQL查詢中使用dword(a)結果。

以IP地址206.191.158.55開頭。

((206 * 256 + 191) * 256 + 158) * 256 + 55 

將得到IP地址的dword等價物。在這種情況下,3468664375

查看更多關於DWORD相當於ip地址here

相關問題