MySQL按字母和数字排序

6

我有一个数组,我想按字母顺序排序,但也要按末尾的数字排序。

"SELECT DISTINCT Number FROM database WHERE 1 Order By Number ASC";

以下是当前的排序方式:

Number 1
Number 10
Number 11
Number 2
Number 3
Number 4
Number 5
Number 6
Number 7
Number 8
Number 9
The End

以下是我希望排序的方式:

Number 1
Number 2
Number 3
Number 4
Number 5
Number 6
Number 7
Number 8
Number 9
Number 10
Number 11
The End

1
看起来你的数字列是一个字符串值。在排序之前,你可以尝试将其转换为整数。 - Taryn East
可能是 MySQL 自然排序 的重复问题。 - Ejaz
可能是SQL将字符串作为数字排序的重复问题。 - But those new buttons though..
6个回答

8
添加另一个排序条件:
Order By LENGTH(Number), Number;

这个方法有效是因为更长的数字也是更大的数字;对于相同长度的数字,你可以进行文本比较,因为 '0' < '1' .... < '9'


这个会一直有效吗?我真的觉得可能有一些隐藏的问题。 - Menno
@Aquillo 我已经添加了一个解释为什么它能够工作。如果你找到一个它给出错误结果的情况,请随意告诉我 :) - Ja͢ck
由于Taryn在另一个答案中发表了评论,如果前面的字符串(在本例中为“Number”)不总是7个字符怎么办?那么你的长度就会错乱。 - Menno
你说得对,我也注意到了。但是你的解决方案会把“结束”放在前面,因为长度更小?(仍然认为你的方法很好,但感觉这是一个糟糕的数据库设计) - Menno
1
@Aquillo 是的,MySQL 中自然排序几乎是一个缺失的功能,这并没有什么帮助 :( - Ja͢ck
显示剩余2条评论

2
尝试这个:-
SELECT distinct numberr FROM tablename Order By cast(substring(numberr,7) as unsigned int) ASC ;

它运行良好。

输出:

Number 1
Number 2
Number 3
Number 4
Number 5
Number 6
Number 7
Number 10
Number 11

它没有按字母顺序排序。 - Ja͢ck
1
只有当开头的字符串始终为7个字符长时,这才能正常工作...但你无法保证这一点。 - Taryn East

0
尝试在排序字段中添加“+0”:
SELECT DISTINCT Number FROM database WHERE 1 Order By Number+0 ASC

0

SQL有函数可以将字符串转换为整数,同时进行排序。

如果您正在使用MySQL,这就是您想要做的:

SELECT DISTINCT Number FROM database Order By CAST(Number AS UNSIGNED) ASC

如果您使用的是不同的数据库,您需要搜索如何将列转换为整数以适用于您的数据库。

注意:其他一些解决方案可能有效...但有点hacky - 即它们看起来很酷,但未来可能无法工作。上述方法完全符合您的要求,并且是您“应该”这样做的方式;)


SELECT CAST('Number 11' AS UNSIGNED) 的结果是 0 - Ja͢ck
为什么要传递一个包含单词“number”的字符串?不要传递“Number 11”,而应该传递“11”或列名为Number - Taryn East
尝试运行:SELECT CAST('11' AS UNSIGNED),你将会得到正确的结果 11 - Taryn East
1
我传递了那个字符串,因为它是在“Number”列中的内容 :) - Ja͢ck
啊哈 - 是的,我明白了。我错过了它说有一个字符串和一个数字的那部分... - Taryn East

0
"SELECT DISTINCT Number FROM database WHERE 1 Order By substring_index(Number,'Number',1),cast(substring_index(Number,'Number ',-1) as unsigned int) ASC";

如果出现“结束”的情况会发生什么? - Menno
@Aquillo,你是不是指的是the end而不是Number字符串? - Amir
例如在提供的例子中,可以使用“数字9”代替。 - Menno

0

虽然我来晚了,但我也遇到了同样的问题。我的答案可能会帮助那些正在面临这个问题的人。
您可以使用SUBSTRING_INDEX函数来解决此问题。例如,如果您的数字位于字符串末尾,则查询应如下所示。

SELECT DISTINCT Number 
FROM database 
WHERE 1 Order By 0+SUBSTRING_INDEX(Number,' ',-1) 
ASC;

这将会取出由空格分隔的文本的最后一块,并且0+将强制将其转换为整数。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接