如何自然排序“ X-Y”字符串数据,首先按X,然后按Y?

问题描述

给出此数据:

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

Demo on db-fiddle

如果值分别可以超过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

这按连字符之前的部分作为字符串排序。并将连字符后的部分转换为数字以进行排序。