我正在尝试解决可以比较表中2列的问题。 表格如下
------------------------------------------
| from | to | Country |
------------------------------------------
| 25.0.0.1 | 25.255.255.255 | denmark |
------------------------------------------
| 68.0.0.1 | 68.255.255.255 | USA |
我的问题是我有一个25.195.32.0
的IP,我希望将其与from
和to
列进行比较,然后返回country name
。
答案 0 :(得分:11)
您可以使用INET_ATON
获取要比较的IP的数值。
SELECT country FROM table
WHERE INET_ATON('25.195.32.0') BETWEEN INET_ATON(from) AND INET_ATON(to)
http://dev.mysql.com/doc/refman/5.7/en/miscellaneous-functions.html#function_inet-aton
答案 1 :(得分:1)
根据您使用IN()
或AND
OR
尝试条件
WHERE from IN('your_ip') OR to IN('your_ip')
答案 2 :(得分:1)
将IP转换为整数,然后比较整数很简单。 MySQL提供了inet_aton
功能。
select Country from table_name where inet_aton($ip) between inet_aton(`from`) and inet_aton(`ip`);
为了提高性能,您应该将列from
,to
转换为整数。例如。添加到列from_n
,to_n
。然后你的SQL将是这样的:
select Country from table_name where inet_aton($ip) between `from_n` and `to_n`
如果您不使用MySQL,则应首先将$ip
转换为整数$ ip_n(使用类似Python socket.inet_aton
之类的内容),然后将inet_aton($ip)
替换为{{1} }}
答案 3 :(得分:1)
select * from db.table
然后在php中(假设您运行了任务并存储了结果):
$lookupIP;
for($i=0;$i<$db->getRowCount();$i++) {
$partsFROM = explode(".", $FROM);
$partsTO = explode(".", $TO);
$partsLOOKUP = explode(".",$lookupIP);
if(
$partsLOOKUP[0] >= $partsFROM[0] && $partsLOOKUP[0] <= $partsTO[0]
&& $partsLOOKUP[1] >= $partsFROM[1] && $partsLOOKUP[1] <= $partsTO[1]
&& etc..
) return $Country
}
不是特别高效或优雅,但你明白了。
答案 4 :(得分:1)
正如我从问题中解释的那样,您可以使用一些掩码并获取基本IP地址,然后进行比较。要使用掩码并获取基本ip,您需要了解有关使用寻址的不同类(A,B,C,D)的信息。
答案 5 :(得分:1)
INET_ATON
为IPV4
地址提供了所需的解决方案。
除此之外,您还可以尝试HEX
版本的IP进行比较。
SELECT HEX( input_ip_value )
BETWEEN HEX( from_ip_column )
AND HEX( to_ip_column )
示例:
mysql> select @i:=hex('25.195.32.0'),
-> @f:=hex('25.0.0.1'),
-> @t:=hex('25.255.255.255'),
-> @i between @f and @t is_between;
+------------------------+---------------------+------------------------------+------------+
| @i:=hex('25.195.32.0') | @f:=hex('25.0.0.1') | @t:=hex('25.255.255.255') | is_between |
+------------------------+---------------------+------------------------------+------------+
| 32352E3139352E33322E30 | 32352E302E302E31 | 32352E3235352E3235352E323535 | 1 |
+------------------------+---------------------+------------------------------+------------+
答案 6 :(得分:1)
选择一个范围:
SELECT Country FROM table_name WHERE ip_address >= from AND to <= ip_address
如果你可以使用脚本(例如php),你可以选择整个表并为IP制作一个掩码。类似的东西:
我们可以知道什么属于网络地址192.168.129.3/18 ip as 如下:
ip_en_binario = decbin (ip2long ("192.168.129.3")); mascara_en_binario = decbin (ip2long ("255.255.192.0")); resultado_en_binario $ = $ & $ mascara_en_binario ip_en_binario; miss long2ip (bindec ($ resultado_en_binario));
结果返回我们这个脚本是192.168.128.0,这是IP所属的网络地址192.168.129.3/18。
然后,您可以使用“from”和“to”字段对网络进行“选择”。
答案 7 :(得分:0)
使用此查询
select Country from table_name where from=to;