9

假设有一张表只有一个字段。表已命名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)

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

192.168.0.0

192.2.3.50

192.23.4.60

问题

上述查询是否有任何替代方案适用于上述所有情况?

4

3 回答 3

13

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

SELECT INET_NTOA(INET_ATON(ipfield) & 0xFFFFFF00)
于 2013-04-04T16:46:37.443 回答
6

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

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

这是一个SQLFiddle示例

于 2013-04-04T16:51:38.927 回答
5

我建议使用SUBSTRING_INDEX这个:

SELECT SUBSTRING_INDEX(ip, '.', 3) as network, COUNT(*) as c
FROM address
GROUP BY network
HAVING(c>1)
LIMIT 500
于 2013-04-04T16:53:05.250 回答