Mysql 选择类似的IP地址-忽略最后3位数字
我有一个包含用户名和IP的表。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的用户列表-忽略最后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
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函数。