2013-03-20 51 views
1

我在同一个表中有很多来自MySQL的ip地址,ip是不同的分段。Mysql按部分字符串排序OR符号后一些int

我希望选择这样的结果。 如何使用顺序?

192.168.1.1 
192.168.1.2 
192.168.1.10 
192.168.1.111 
192.168.1.23 
192.168.1.25 
192.168.20.1 
192.168.20.31 
192.168.20.25 
192.168.35.2 
192.168.35.21 
192.168.35.125 

In Now Mysql_query like this。

192.168.1.1 
192.168.1.10 
192.168.1.111 
192.168.1.2 
192.168.1.23 
192.168.1.25 
.... 
+0

我会感到惊讶,如果是一个真正优雅的解决方案,你可以把4个部分IP的分成四个单独的列。 – Adder 2013-03-20 15:17:46

+0

检查这个答案:http://stackoverflow.com/a/8999436/1618257 – 2013-03-20 15:18:56

+1

检查了这一点http://stackoverflow.com/questions/8719945/order-by-numbers-help-me-sort-ip-addresses – 2013-03-20 15:19:54

回答

0

我看起来像一个重复的问题,见上文(order by.... numbers? Help me sort ip addresses)Legendinmaking的评论。

波兰王子及其后的作品,但基于以前的帖子,我会建议这样的:

SELECT ip 
FROM ips 
ORDER BY INET_ATON(ip); 

的样本数据:

CREATE TABLE ips 
    (`ip` varchar(14)); 

INSERT INTO ips 
    (`ip`) 
VALUES 
    ('192.168.35.2'), 
    ('192.168.35.21'), 
    ('192.168.1.1'), 
    ('192.168.1.2'), 
    ('192.168.35.125'), 
    ('192.168.1.23'), 
    ('192.168.1.25'), 
    ('192.168.20.1'), 
    ('192.168.20.31'), 
    ('192.168.1.10'), 
    ('192.168.1.111'), 
    ('192.168.20.25'); 

SQL FIDDLE demo

请注意,这是基于波兰王子他的SQL小提琴和Legendinmaking的评论。

0

事情是这样的......

SELECT v.ip 
FROM (SELECT ip, 
       CAST(Substring_index(ip, '.', 1) AS UNSIGNED INTEGER) first, 
       CAST(Substring_index(Substring_index(ip, '.' 
        , 2), '.', -1) AS UNSIGNED INTEGER)    second, 
       CAST(Substring_index(Substring_index(ip, '.' 
        , -2), '.', 1) AS UNSIGNED INTEGER)    third, 
       CAST(Substring_index(ip, '.', -1) AS UNSIGNED INTEGER) fourth 
     FROM ips) v 
ORDER BY v.first, 
      v.second, 
      v.third, 
      v.fourth 

See the demo