如何对“X-Y”字符串数据进行自然排序,先按 X 再按 Y?

How to natural sort “X-Y” string data, first by X and then by 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来提取两个数值来找到- 两个数字之间),然后 LPAD 将每个值填充到 2 位和 5 位数字,以便按数字对它们进行排序:

SELECT *
FROM data
ORDER BY LPAD(SUBSTR(id, 2, LOCATE('-', id) - 2), 2, '0') DESC,
         LPAD(SUBSTR(id, LOCATE('-', id) + 1), 5, '0') DESC

输出(对于我的扩展样本):

id
W20-12457
W20-4617
W20-100
W19-1040
W18-40461
W4-2017

Demo on db-fiddle

如果值可以分别超过2位或5位,只需将第二个参数更改为LPAD即可。

我会这样做:

order by substring_index(col, '-', 1) desc,
         substring_index(col, '-', -1) + 0 desc

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