某字段中有以下类似的值需要排序,先要截取"/"后面的字符串,然后按“xxx+_数字”排序
folder/xxx_2_43_1024
folder/xxx_43_1024
folder/xxx_1_43_1024
folder/xxx_3_43_1024
folder/xxx_10_43_1024
folder/xxx_11_43_1024
出来的结果是
folder/xxx_43_1024  //其实这里可以认为folder/xxx_0_43_1024
folder/xxx_1_43_1024
folder/xxx_2_43_1024
folder/xxx_3_43_1024
folder/xxx_10_43_1024
folder/xxx_11_43_1024

解决方案 »

  1.   

    select * 
    from tb
    order by replace(replace(column,'folder/xxx_',''),'_43_1024','')
      

  2.   


    谢谢,不过我这里 folder  xxx 43   1024 都不是固定的字母或者数字  
      

  3.   

    建议楼主提供更多的数据样本以便别人正确了解需求。(不要高估你的汉语表达能力或者我的汉语理解能力)[/color]
       建议你列出你的表结构,并提供测试数据以及基于这些测试数据的所对应正确结果。
       参考一下这个贴子的提问方式http://topic.csdn.net/u/20091130/20/8343ee6a-417c-4c2d-9415-fa46604a00cf.html
       
       1. 你的 create table xxx .. 语句
       2. 你的 insert into xxx ... 语句
       3. 结果是什么样,(并给以简单的算法描述)
       4. 你用的数据库名称和版本(经常有人在MS SQL server版问 MySQL)
       
       这样想帮你的人可以直接搭建和你相同的环境,并在给出方案前进行测试,避免文字描述理解上的误差。
      

  4.   

    不好意思,是我没说清楚
      字段                          真正要排序的字符串                 
    folder/xxx_2_43_1024            xxx_2   
    folder/xxx_43_1024              xxx_0  //可以这样认为xxx加"_0"
    folder/xxx_1_43_1024            xxx_1
    folder/xxx_3_43_1024            xxx_3
    folder/xxx_10_43_1024           xxx_10
    folder/xxx_11_43_1024           xxx_11
    aaa/abc_3_250_2048              abc_3
    aaa/abc_2_250_2048              abc_2
    aaa/abc_250_2048                abc_0   //可以这样认为abc加"_0"
    aaa/abc_1_250_2048              abc_1
    aaa/abc_20_250_2048             abc_20
    aaa/abc_29_250_2048             abc_29
    cccc/abcd_3_250_2048            abcd_3
    cccc/abcd_4_250_2048            abcd_4
    cccc/abcd_250_2048              abcd_0   //可以这样认为abcd加"_0"
    cccc/abcd_1_250_2048            abcd_1
    cccc/abcd_20_250_2048           abcd_20
    cccc/abcd_29_250_2048           abcd_29
    字符串命名规则 
    文件夹名字/名字_序号_数字1_数字2,
    其中,文件夹名字和名字都不定长,序号如果是0的话就会没有(即 文件夹名字/名字_数字1_数字2)上面数据需要的排序结果
    folder/xxx_43_1024
    folder/xxx_1_43_1024
    folder/xxx_2_43_1024
    folder/xxx_3_43_1024  
    folder/xxx_10_43_1024
    folder/xxx_11_43_1024aaa/abc_250_2048  
    aaa/abc_1_250_2048
    aaa/abc_2_250_2048
    aaa/abc_3_250_2048
    aaa/abc_20_250_2048
    aaa/abc_29_250_2048cccc/abcd_250_2048 
    cccc/abcd_1_250_2048 
    cccc/abcd_3_250_2048 
    cccc/abcd_4_250_2048
    cccc/abcd_20_250_2048 
    cccc/abcd_29_250_2048
      

  5.   

    假设记录内容固定,字段名NN,表名TTM
    SELECT nn,SUBSTRING_INDEX(nn,'_',-2) AS s2,
    IF(MID(SUBSTRING_INDEX(nn,'_',-3),1,1) REGEXP '[a-zA-Z]',0,MID(SUBSTRING_INDEX(nn,'_',-3),1,1)) AS SS1
    FROM ttm
    ORDER BY 1,3,2
      

  6.   

    mysql> select * from t_doudoushen;
    +----+-----------------------+
    | id | col                   |
    +----+-----------------------+
    |  1 | folder/xxx_2_43_1024  |
    |  2 | folder/xxx_43_1024    |
    |  3 | folder/xxx_1_43_1024  |
    |  4 | folder/xxx_3_43_1024  |
    |  5 | folder/xxx_10_43_1024 |
    |  6 | folder/xxx_11_43_1024 |
    |  7 | aaa/abc_3_250_2048    |
    |  8 | aaa/abc_2_250_2048    |
    |  9 | aaa/abc_250_2048      |
    | 10 | aaa/abc_1_250_2048    |
    | 11 | aaa/abc_20_250_2048   |
    | 12 | aaa/abc_29_250_2048   |
    | 13 | cccc/abcd_3_250_2048  |
    | 14 | cccc/abcd_4_250_2048  |
    | 15 | cccc/abcd_250_2048    |
    | 16 | cccc/abcd_1_250_2048  |
    | 17 | cccc/abcd_20_250_2048 |
    | 18 | cccc/abcd_29_250_2048 |
    +----+-----------------------+
    18 rows in set (0.00 sec)mysql> select *
        -> from t_doudoushen
        -> order by SUBSTRING_INDEX(col,'_',1), col like '%\_%\_%\_%',SUBSTRING_INDEX(SUBSTRING_INDEX(col,'_',2),'_',-1)+0;
    +----+-----------------------+
    | id | col                   |
    +----+-----------------------+
    |  9 | aaa/abc_250_2048      |
    | 10 | aaa/abc_1_250_2048    |
    |  8 | aaa/abc_2_250_2048    |
    |  7 | aaa/abc_3_250_2048    |
    | 11 | aaa/abc_20_250_2048   |
    | 12 | aaa/abc_29_250_2048   |
    | 15 | cccc/abcd_250_2048    |
    | 16 | cccc/abcd_1_250_2048  |
    | 13 | cccc/abcd_3_250_2048  |
    | 14 | cccc/abcd_4_250_2048  |
    | 17 | cccc/abcd_20_250_2048 |
    | 18 | cccc/abcd_29_250_2048 |
    |  2 | folder/xxx_43_1024    |
    |  3 | folder/xxx_1_43_1024  |
    |  1 | folder/xxx_2_43_1024  |
    |  4 | folder/xxx_3_43_1024  |
    |  5 | folder/xxx_10_43_1024 |
    |  6 | folder/xxx_11_43_1024 |
    +----+-----------------------+
    18 rows in set (0.00 sec)mysql>
      

  7.   

    先感谢2位版主to ACMAIN_CHM  
    小弟还想请教,还麻烦老大教我order by SUBSTRING_INDEX(col,'_',1), col like '%\_%\_%\_%',SUBSTRING_INDEX(SUBSTRING_INDEX(col,'_',2),'_',-1)+0;1、我不需要对文件夹名字排序是否能把SUBSTRING_INDEX(col,'_',1)这句去掉
    2、col like '%\_%\_%\_%'这句话是啥意思,把xxx_43_1024、xxx_1_43_1024格式化成什么
    3、SUBSTRING_INDEX(SUBSTRING_INDEX(col,'_',2),'_',-1)+0; 加0是什么作用4、最后如果我想反过来排序
    即希望结果是
    folder/xxx_11_43_1024
    folder/xxx_10_43_1024
    folder/xxx_3_43_1024 
    folder/xxx_2_43_1024
    folder/xxx_1_43_1024
    folder/xxx_43_1024
    这是我写的还是不对:
    select col from t_doudoushen order by
    col like '%\_%\_%\_%',
    SUBSTRING_INDEX(SUBSTRING_INDEX(col,'_',2),'_',-1)+0  desc;