2012-10-04 21 views
5

Tengo una tabla con nombres de usuario e IP.
que necesito para obtener una lista de los usuarios que tienen similares IP - ignoran 3 o 2 o 1 último dígito (s) -Seleccione direcciones IP similares: ignore los últimos 3 dígitos

Ejemplo:
Conde 190.200.210.180 y 190.200.210.60 como la misma IP.
Cuenta 205.50.4.30 y 205.50.4.197 como la misma IP.

El tipo de campo de direcciones IP se establece como varchar y esto es algo que no puedo cambiar por el momento.

Actualmente estoy usando:

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

para llegar a los usuarios con la misma IP. SQL statement output

¿Es posible con el campo de las direcciones IP se establece como varchar para hacer una instrucción de selección a los usuarios del grupo con IPS similares?

Gracias de antemano por su ayuda.

Respuesta

4

Prueba esto:

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 
4

El SUBSTR_INDEX función permite analizar una dirección IP de una operación fácil:

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 

Usando los octetos alias a, b, c, d como una base, usted debe ser capaz de aplicar la misma lógica a su pregunta y realizar el octeto de coincidencia que desee ...

+0

muy fresco. Solo curiosidad, ¿por qué usaste una sub selección en tu cláusula from? – Tom

+0

El usuario podría simplemente agrupar por a, byc con lo que tienes arriba. – Tom

2

Personalmente, me gustaría ir sobre la eliminación de la última .nnn parte como en ...

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 
+1

Buena alternativa. Lo único es que usa más recursos, debido al uso de SUBSTRING 2 veces y la función CHAR_LENGTH también. –

+2

Tiene razón, pero no estoy seguro de que cada IP tenga * n * cantidad de períodos. – inhan

Cuestiones relacionadas