问题描述
给出此数据:
W18-40461
W19-1040
W20-4617
W20-100
我已经尝试了几种常见的MysqL自然排序方法,但是它们不会以自然降序的方式对它们进行排序,例如:
W20-4617
W20-100
W19-1040
W18-40461
例如:
select theID
from Table
where theID
order by lpad(theID,9,0) desc
解决方法
假设-
两侧的部分分别限制为2位和5位,则可以使用SUBSTR
(和LOCATE
提取两个数值来找到{ {1}}(两个数字之间),然后-
将这些值分别填充到2位和5位数字,以便对其进行数字排序:
LPAD
输出(对于我的扩展示例):
SELECT *
FROM data
ORDER BY LPAD(SUBSTR(id,2,LOCATE('-',id) - 2),'0') DESC,LPAD(SUBSTR(id,id) + 1),5,'0') DESC
如果值分别可以超过2位或5位数字,只需将第二个参数更改为id
W20-12457
W20-4617
W20-100
W19-1040
W18-40461
W4-2017
即可。
我会这样:
order by substring_index(col,'-',1) desc,substring_index(col,-1) + 0 desc
这按连字符之前的部分作为字符串排序。并将连字符后的部分转换为数字以进行排序。