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

Mysql 选择类似的IP地址-忽略最后3位数字,mysql,Mysql,我有一个包含用户名和IP的表。 我需要得到一个具有类似IP的用户列表-忽略最后3位、2位或1位数字- 示例: 将190.200.210.180和190.200.210.60计算为同一IP。 将205.50.4.30和205.50.4.197计算为同一IP。 IPs的字段类型设置为varchar,这是我目前无法更改的 目前我正在使用: SELECT GROUP_CONCAT( username ) names, IPs, COUNT( IPs ) AS Instances FROM users

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

示例:
190.200.210.180190.200.210.60计算为同一IP。
205.50.4.30205.50.4.197计算为同一IP。

IPs的字段类型设置为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的用户。

IPs字段设置为varchar时,是否可以使用select语句对具有类似IP的用户进行分组


提前感谢您的帮助。

函数SUBSTR\u 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作为基础,您应该能够对问题应用类似的逻辑,并执行所需的八位组匹配…

尝试以下方法:

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

就我个人而言,我会删除最后的.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

很酷。只是好奇,为什么你在from子句中使用了一个子select?用户可能只需要将上面的内容按a、b和c进行分组。很好的选择。唯一的问题是它使用了更多的资源,因为使用了2次子字符串和CHAR_LENGTH函数。