5

我有一个包含用户名和 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 语句输出

是否可以将 IP 的字段设置为 varchar 以做出选择语句来对具有相似 ip 的用户进行分组?

预先感谢您的帮助。

4

3 回答 3

5

试试这个:

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
于 2012-10-04T00:21:31.057 回答
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 作为基础,您应该能够对您的问题应用类似的逻辑并执行您想要的八位字节匹配...

于 2012-10-04T00:14:06.343 回答
2

就个人而言,我会去消除最后的.nnn部分,如...</p>

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
于 2012-10-04T00:48:38.207 回答