我有一个包含用户名和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的用户。
是否可以将IP字段设置为varchar,以使select语句对具有相似ips的用户进行分组?
提前感谢您的帮助。
答案 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