带通配符的DISTINCT / GROUP BY。 SQL

时间:2015-08-26 20:54:05

标签: mysql sql ip

我的表看起来像这样:

ip
192.168.1.1
192.168.1.2
192.168.1.3
192.168.1.4
192.168.1.5
(...)
192.168.1.254

我试图从表中获得一个结果,告诉我我的数据库中有哪些类(例如地址192.168.1.1结果是192.168.1.0/24或只是192.168.1.0)。

这可以使用该数据库吗?

1 个答案:

答案 0 :(得分:1)

你可以这样做:

SELECT  concat(LEFT(ipAddress, LENGTH(ipAddress) - LOCATE('.', REVERSE(ipAddress))), '.0') as ipClassThing, 
        count(1) as numberInClassTypeThing
FROM    test t
GROUP   BY LEFT(ipAddress, LENGTH(ipAddress) - LOCATE('.', REVERSE(ipAddress)))

请参阅SQL Fiddle

基本上在上面,我们正在查找.的最后一次出现,只取其前面的字符串部分,然后在最后添加.0

使用示例数据/表:

create table test (ipaddress varchar(50));

insert into test (ipaddress) values ('192.168.1.1');
insert into test (ipaddress) values ('192.168.1.0');
insert into test (ipaddress) values ('192.168.1.55/24');
insert into test (ipaddress) values ('10.1.1.1');

以上查询给出了结果:

ipClassThing    numberInClassTypeThing
----
10.1.1.0        1
192.168.1.0     3