MySQL用字母数字前缀排序

时间:2015-10-02 08:57:01

标签: mysql sorting columnsorting

我有一个包含以下数据的列的数据库:

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个,我必须重新格式化此列。

提前谢谢大家! :)

4 个答案:

答案 0 :(得分:2)

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

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

如果存在与数字不匹配的表达式,CAST函数将返回0,并且将首先显示这些记录。如果需要,您可以单独处理。

答案 1 :(得分:1)

我有一个类似的问题,为我做的伎俩是这个

*" ORDER BY LENGTH(column_name),column_name

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

Andreas Bergströmthis question上提供的

希望有人帮助。

答案 2 :(得分:0)

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

假设你有这样的数据:

id
----
1
2
6
10
13

当您ORDER BY id ASC返回时:

id
----
1
10
13
2
6

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

因此,当您拥有我上面提供的表数据时,您可以按照以下方式对它们进行排序:

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

根据您的数据。 SELECT SUBSTR('aaa-100',5,LENGTH('aaa-100') - 3)返回100
因此,SELECT LPAD( SUBSTR('aaa-100',5,LENGTH('aaa-100') - 3), 7, '0')返回00000100

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

答案 3 :(得分:0)

这是字母顺序,
你想要数字顺序,
要做到这一点,你必须在ORDER BY子句

  1. 修剪costant" aaa - "部分
  2. 将其转换为数字

    转换(SUBSTRING(val,3),整数)