选择类似的IP地址 - 忽略最后3位数

时间:2012-10-04 00:06:09

标签: mysql

我有一个包含用户名和IP的表 我需要获得具有类似IP的用户列表 - 忽略最后3或2或1位数 -

示例:
190.200.210.180 190.200.210.60 计为相同的IP。
205.50.4.30 205.50.4.197 计为相同的IP。

IP的字段类型设置为varchar,这是我目前无法改变的。

目前我正在使用:

SELECT GROUP_CONCAT( username ) names, IPs, COUNT( IPs ) AS Instances 
FROM users
GROUP BY IPs
HAVING (COUNT(IPs) >1)
ORDER BY  `Instances ` DESC 

获取具有相同IP的用户。 SQL statement output

是否可以将IP字段设置为varchar,以使select语句对具有相似ips的用户进行分组?

提前感谢您的帮助。

3 个答案:

答案 0 :(得分:4)

SUBSTR_INDEX函数使解析IP地址变得简单:

  SELECT SUBSTRING_INDEX(SUBSTRING_INDEX(y.IPs,'.',1),'.',-1) a,
         SUBSTRING_INDEX(SUBSTRING_INDEX(y.IPs,'.',2),'.',-1) b,
         SUBSTRING_INDEX(SUBSTRING_INDEX(y.IPs,'.',3),'.',-1) c,
         SUBSTRING_INDEX(SUBSTRING_INDEX(y.IPs,'.',4),'.',-1) d
  FROM (SELECT ... FROM users) y

使用别名八位字节a,b,c,d作为基础,您应该能够对您的问题应用类似的逻辑并执行您想要的八位字节匹配...

答案 1 :(得分:4)

试试这个:

SELECT 
    GROUP_CONCAT(username) AS names, 
    SUBSTRING_INDEX(IPs, '.', 3) AS IPs
    COUNT(*) AS Instances 
FROM
    users
GROUP BY 
    SUBSTRING_INDEX(IPs, '.', 3)
HAVING
    COUNT(*) > 1
ORDER BY
    Instances DESC

答案 2 :(得分:2)

就个人而言,我会在...中删除最后的 .nnn 部分。

SELECT
    GROUP_CONCAT(`username` SEPARATOR ', ') AS 'names',
    SUBSTRING(`IPs`,1,(CHAR_LENGTH(`IPs`)-CHAR_LENGTH(SUBSTRING_INDEX(`IPs`,'.',-1))-1)) AS 'roughIP',
    COUNT(*) AS 'Instances'
FROM `users`
GROUP BY `roughIP`
ORDER BY `Instances` DESC