假设有一个表只有一个字段。表名为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
问题
上述查询是否有任何替代方案可以在上述所有情况下使用?
答案 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