【问题标题】:mysql sort alphabetical and numbermysql按字母和数字排序
【发布时间】:2013-05-06 06:54:10
【问题描述】:

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

"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

【问题讨论】:

标签: mysql


【解决方案1】:

添加另一个排序条件:

Order By LENGTH(Number), Number;

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

【讨论】:

  • 这会一直有效吗,因为我真的觉得可能有一些隐藏的问题。
  • @Aquillo 我已经添加了它为什么起作用的解释。随意找到给出错误结果的案例:)
  • 由于 Taryn 对此发表了评论以获得另一个答案,如果前面的字符串(在本例中为“数字”)并不总是 7 个字符怎么办?你的长度会被弄乱。
  • @Aquillo 这在逻辑上仍然假设前缀是相同的,即使长度本身并不固定;如果我知道更多,我可以建议使用SUBSTRING_INDEX() 先向左排序,然后向右排序。但是对于The End,这可能会失败。
  • @Aquillo 是的,自然排序在 MySQL 中几乎是一个缺失的特性,这无济于事:(
【解决方案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

【讨论】:

  • 不是按字母顺序排序的。
  • 这仅在开头的字符串始终为 7 个字符长时才有效...您不能保证。
【解决方案3】:

sql 具有在排序时将字符串转换为整数的函数。

如果您使用的是 mysql,这就是您想要做的事情:

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

如果您使用的是不同的数据库,则需要在 Google 上搜索如何将列转换为数据库的整数。

注意:其他一些解决方案可以工作......但有点hacky - 即它们看起来很酷,但将来可能无法工作。以上正是你想要的,也是你“应该”做的;)

【讨论】:

  • SELECT CAST('Number 11' AS UNSIGNED) 产生0
  • 你为什么要传递一个带有单词编号的字符串?不要传“数字 11”,传“11”或名为Number的列
  • 尝试:SELECT CAST('11' AS UNSIGNED),你会正确得到11
  • 我正在传递该字符串,因为那是 Number 列中的内容 :)
  • 啊哈——是的,我明白了。我错过了它说它有一个字符串然后是一个数字的部分......
【解决方案4】:
"SELECT DISTINCT Number FROM database WHERE 1 Order By substring_index(Number,'Number',1),cast(substring_index(Number,'Number ',-1) as unsigned int) ASC";

【讨论】:

  • 如果出现“结局”会怎样?
  • @Aquillo,你的意思是 the end 而不是 Number 字符串?
  • 而不是“数字 9”,例如提供的示例。
【解决方案5】:

我来晚了,但我遇到了同样的问题。我的回答可以帮助那些面临的人。
您可以使用SUBSTRING_INDEX 函数来解决此问题。就像您的号码在字符串的末尾一样。您的查询应该是。

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

这样做的目的是将文本的最后一块用空格分隔。并且 0+ 将强制将其转换为整数。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-03-07
    • 1970-01-01
    • 1970-01-01
    • 2013-10-05
    • 2022-06-13
    • 1970-01-01
    • 2014-10-08
    相关资源
    最近更新 更多