按字母顺序排列,然后按数字排序。

15

我正在寻找一些针对 MySQL 排序的调整方法,通常我会从表中选择记录,然后按名称(varchar)升序排序但数字总是排在第一位

这里有一些我的问题示例(请注意,MySQL 会优先按照 0-9 进行排序

SELECT name FROM list ORDER BY name ASC
record returned:
1 star
2 star
9 slice
Ape
Age
Beg
Bell
Fish
Zoo

我想要的是字母按顺序排列,然后再跟着数字。

所需输出

Ape
Age
Beg
Bell
Fish
Zoo
1 star
2 star
9 slice

我尝试让问题简单明了,如果需要更多信息,请告诉我,谢谢! - Leon Armstrong
5个回答

34

请使用以下的 ORDER BY 子句:

ORDER BY IF(name RLIKE '^[a-z]', 1, 2), name

1
RLIKE或LIKE ? 没有理解。 - Grijesh Chauhan
1
@GrijeshChauhan 中的 R 代表正则表达式。 - Leon Armstrong
1
哇!!它节省了我很多时间。非常感谢 :) - Ravi Dhoriya ツ
1
你如何进行降序排序?例如:9、2、1、Zoo、Fish、Bell? - friek108
1
添加 DESC: ORDER BY IF(name RLIKE '[a-z]'), 1, 2) DESC, name DESC - Barmar

10

参考这个

SELECT name FROM list ORDER BY name * 1 ASC

编辑过的

SELECT name FROM list ORDER BY name * 1, name ASC

忽略所有字母。 - Barmar
@barmar:- 是的,我同意你的看法。 - Salil
这对我有用。不知何故,Barmar的答案没有起作用。 - Matthew Zourelias

0

这是我在使用POSTGRESQL数据库的Rails中成功的方法

.order(Arel.sql("SUBSTRING(LOWER(name), '^[A-Za-z].*'), SUBSTRING(LOWER(name), '^[0-9]+')::FLOAT"))  

                       

0
你可以试着像这样做:
SELECT 
    name 
FROM 
    list 
ORDER BY 
    IF(name REGEXP '^[0-9]', CONCAT('zz',name),name) ASC

如果您的名字以数字开头,则在开头连接'zz'(这样它将排在最后)。


那样做不会使数字在 vw 之间吗? - Barmar
@Barmar 你是对的... 我本来想放字母表的最后一个字母,但即使这样也不能解决所有情况,比如当你有一个名字:'zzabc'。 - Stephan
这就是为什么我的解决方案是最好的。 - Barmar
很棒的技巧,但我正在处理一个大字典表,所以我会坚持使用@Barmar的解决方案,无论如何,谢谢! - Leon Armstrong
是的,我们都可以同意,@Barmar 提供的最佳/最干净的解决方案。 - Stephan

-2

试试这个...

这是一个简单的方法来得到你的答案

SELECT name  from list ORDER BY (name +0) ASC ,name ASC

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