提取IPV4的前三个八位字节

Han*_*nky 8 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
Run Code Online (Sandbox Code Playgroud)

我需要在这个表上运行一个查询,它将返回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)
Run Code Online (Sandbox Code Playgroud)

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

192.168.0.0

192.2.3.50

192.23.4.60

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

Mar*_*c B 10

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

SELECT INET_NTOA(INET_ATON(ipfield) & 0xFFFFFF00)
Run Code Online (Sandbox Code Playgroud)


Mar*_*tin 6

你可以substring_index这样做:

SELECT substring_index(network, '.', 3) AS Octet,
       COUNT(*)
  FROM address
  GROUP BY Octet
Run Code Online (Sandbox Code Playgroud)

这是一个SQLFiddle示例


Mik*_*ant 5

我建议SUBSTRING_INDEX为此使用:

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