假设有一个只有一个字段的表.表已命名,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)
你可以substring_index这样做:
SELECT substring_index(network, '.', 3) AS Octet,
COUNT(*)
FROM address
GROUP BY Octet
Run Code Online (Sandbox Code Playgroud)
这是一个SQLFiddle示例
我建议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)