MySQL 使用字母数字前缀排序

MySQL sorting with alphanumeric prefix

我有一个数据库,其中有一列包含以下数据:

aaa-1
aaa-2
aaa-3
...
aaa-10
aaa-11
...
aaa-100
aaa-101
...
aaa-1000

当我按升序查询和排序数据时,我得到:

aaa-1
aaa-10
aaa-11
...
aaa-100
aaa-101
...
aaa-1000
...
aaa-2
...
aaa-3

这实际上是正确的(机器)排序方式吗?订单是否因为 aaa- 前缀而被搞砸了?我该如何按照人类的方式对其进行排序(即看起来像第一个片段的东西)?

P.S。如果问题确实出在前缀上,是否有办法将其删除并仅使用数字部分进行排序?

P.P.S。有人向我建议我应该只更改我的数据并添加前导零,例如 aaa-0001aaa-0002 等。但是,每次列表上升一个顺序时,我都不愿意采用这种方法的 10,我必须重新格式化此列。

提前谢谢大家! :)

我给你一个样本排序。不是基于您的数据样本,但这可以帮助您。

假设您有这样的数据:

id
----
1
2
6
10
13

当你做 ORDER BY id ASC 时会 return :

id
----
1
10
13
2
6

我建议,使用LPAD。 此查询:SELECT LPAD('12',5,'0') return 00012

所以当你有像我上面提供的 table 数据时,你可以像这样对它们进行排序:

SELECT * FROM TABLE
ORDER BY LPAD(ID,7,'0') ASC

根据您的数据。 SELECT SUBSTR('aaa-100',5,LENGTH('aaa-100') - 3) return 100
所以,SELECT LPAD( SUBSTR('aaa-100',5,LENGTH('aaa-100') - 3), 7, '0') return 00000100

因此您可以组合字符串函数,例如SUBSTRLPAD。现在有什么线索吗?

这是字母顺序,
你想要数字顺序,
为此,您必须在 ORDER BY 子句中

  1. trim成本"aaa-"部分
  2. 转换成数字

    convert(SUBSTRING(val, 3), integer)

您可以提取数字部分,将其转换为数字数据类型,然后执行 ORDER BY:

SELECT mytable.*,
    CAST(SUBSTRING_INDEX(mycolumn, '-', - 1) AS UNSIGNED) mycolumnintdata
FROM
    mytable
ORDER BY mycolumnintdata;

如果有不匹配数字的表达式,CAST函数将return0并首先显示那些记录。如果需要,您可以单独处理。

我遇到了类似的问题,我的诀窍就是这个

*"按长度排序(column_name), column_name

只要值的 non-numeric 部分长度相同,这将在 10 之前排序 1,在 100 之前排序 10,等等。"*

Andreas Bergström on this question给出。

希望对某人有所帮助。