2010-03-02 72 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

相关问题