提取IPV4的前三个八位字节

时间:2013-04-04 16:44:04

标签: mysql

假设有一个表只有一个字段。表名为address,并且有一个名为ip的字段,其中包含IPV4地址作为其值

示例数据

192.168.120.201
192.168.120.202
192.168.120.203
192.168.120.204
192.168.120.205
192.168.121.3
192.168.121.50

我需要在此表上运行一个查询,该查询将返回前三个八位字节的数据COUNT

预期输出

  

网络计数

     

192.168.120 5

     

192.168.121 3

我尝试使用SUBSTR之类的

SELECT SUBSTR(ip,1,10) as network,COUNT(*) as c FROM address GROUP BY network HAVING(c>1)

但问题是,如果所有前3个八位字节中每个都有3个数字,则此SUBSTR将仅按预期工作,但这会在前三个八位字节中没有3个数字的任何IP地址上中断。例如,这不适用于

  

192.168.0.0

     

192.2.3.50

     

192.23.4.60

问题

上述查询是否有任何替代方案可以在上述所有情况下使用?

3 个答案:

答案 0 :(得分:9)

不要进行字符串操作。你最好将IP转换为int并使用一些位掩码,例如

SELECT INET_NTOA(INET_ATON(ipfield) & 0xFFFFFF00)

答案 1 :(得分:6)

您可以使用substring_index执行此操作:

SELECT substring_index(network, '.', 3) AS Octet,
       COUNT(*)
  FROM address
  GROUP BY Octet

这是一个SQLFiddle示例

答案 2 :(得分:4)

我建议您使用SUBSTRING_INDEX

SELECT SUBSTRING_INDEX(ip, '.', 3) as network, COUNT(*) as c
FROM address
GROUP BY network
HAVING(c>1)
LIMIT 500