2012-01-03 20 views
5

MySQL, tratando de obtener una lista de direcciones IP, en orden.ordenar por ... números? Help me sort ip addresses

esta consulta

select ip from sn_192_168_0 

da este

192.168.0.1 
192.168.0.10 
192.168.0.100 
192.168.0.101 

Queremos

192.168.0.1 
192.168.0.2 
...snip.. 
192.168.0.10 
+0

no tengo tiempo para construir un ejemplo completo en este momento, pero lo que parece que está haciendo es ordenar lexicográficamente (es decir, carácter por personaje). Tendrá que crear un SP (o lógica de aplicación) para forzarlo a clasificar numéricamente (es decir, dividir la dirección IP en cuatro partes y luego ordenarlas por cada una de las partes). Alternativamente, en lugar de dividirlo en cuatro partes, haga un entero único de la dirección IP (primer octeto de la dirección = primeros 8 bits del número, segundo octeto = segundo 8 bits y así sucesivamente) y ordene por eso - direcciones IP en realidad no son más que un entero bien disfrazado. –

+0

@SimonRigharts eso es exactamente lo que está haciendo. La filosofía general es que sería más rápido (pero más costoso en el espacio) convertir todo a un campo de números grandes (o usar cuatro campos nuevos a 3 caracteres de ancho, o tres nuevos campos de bytes) y consultar para ordenar, pero presente este campo para fines de visualización. Hay bibliotecas para convertir la dirección IP a un campo numérico si no desea hacer el análisis usted mismo. – jcolebrand

+0

Sin embargo, dado que esto es solo una cuestión de código, arrancándolo en [SO]. – jcolebrand

Respuesta

15

Pruebe la función INET_ATON

SELECT ip FROM sn_192_168_0 
ORDER BY INET_ATON(ip); 

¡Pruébalo!

CAVEAT: es mejor no almacenar los valores INET_ATON. Existen algunos caprichos del pasado con esta función: tiene números inválidos entre puntos y lo llama en activadores.

Estos errores se limpian ahora.

Las direcciones IP cortas se manejan correctamente. Este es un ejemplo de MySQL 5.5.12 en Windows 7

mysql> SELECT INET_ATON('127.0.0.1'), INET_ATON('127.1'); 
+------------------------+--------------------+ 
| INET_ATON('127.0.0.1') | INET_ATON('127.1') | 
+------------------------+--------------------+ 
|    2130706433 |   2130706433 | 
+------------------------+--------------------+ 
1 row in set (0.05 sec) 
+0

¿Por qué no pensé en eso? Gracias. –

0

puede utilizar

SELECT ip FROM sn_192_168_0 ORDER BY LPAD( ip, 16, 0) 

el número 16 es la longitud máxima de la ip