某字段中有以下类似的值需要排序,先要截取"/"后面的字符串,然后按“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
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
from tb
order by replace(replace(column,'folder/xxx_',''),'_43_1024','')
谢谢,不过我这里 folder xxx 43 1024 都不是固定的字母或者数字
建议你列出你的表结构,并提供测试数据以及基于这些测试数据的所对应正确结果。
参考一下这个贴子的提问方式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)
这样想帮你的人可以直接搭建和你相同的环境,并在给出方案前进行测试,避免文字描述理解上的误差。
字段 真正要排序的字符串
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
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
+----+-----------------------+
| 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>
小弟还想请教,还麻烦老大教我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;