MySQL'Order By' – 正确地排列字母数字

我想按照下面列出的顺序(数字1-12)对以下数据项进行sorting:

 1
 2
 3
 4
五
 6
 7
 8
 9
 10
 11
 12 

但是,我的查询 – 使用order by xxxxx ascorder by xxxxx ascsorting的第一位高于一切:

 1
 10
 11
 12
 2
 3
 4
五
 6
 7
 8
 9 

任何技巧,使其更正确地sorting?

此外,为了充分披露,这可能是字母和数字的混合(尽pipe现在不是),IE:

 A1
 534G
 G46A
 100B
 100A
 100JE

等等….

谢谢!

更新:请求查询的人员

 select * from table order by name asc 

人们使用不同的技巧来做到这一点。 我谷歌search,并找出一些结果,每个按照不同的技巧。 看看他们:

  • MySQL中的数字sorting
  • 在MySQL中自然sorting
  • 将数字值与字母数字值混合sorting
  • mySQL自然sorting
  • 自然sorting在MySQL中

编辑:

我刚刚为未来的访问者添加了每个链接的代码。

MySQL中的数字sorting

给定input

  1A 1a 10A 9B 21C 1C 1D 

预期产出

  1A 1C 1D 1a 9B 10A 21C 

询问

 Bin Way =================================== SELECT tbl_column, BIN(tbl_column) AS binray_not_needed_column FROM db_table ORDER BY binray_not_needed_column ASC , tbl_column ASC ----------------------- Cast Way =================================== SELECT tbl_column, CAST(tbl_column as SIGNED) AS casted_column FROM db_table ORDER BY casted_column ASC , tbl_column ASC 

在MySQL中自然sorting

给定input

 表:sorting_test
  -------------------------- -------------
 | 字母数字VARCHAR(75)| 整数INT |
  -------------------------- -------------
 |  test1 |  1 |
 |  test12 |  2 |
 |  test13 |  3 |
 |  test2 |  4 |
 |  test3 |  5 |
  -------------------------- -------------

预期产出

  -------------------------- ------------- | alphanumeric VARCHAR(75) | integer INT | -------------------------- ------------- | test1 | 1 | | test2 | 4 | | test3 | 5 | | test12 | 2 | | test13 | 3 | -------------------------- ------------- 

询问

 SELECT alphanumeric, integer FROM sorting_test ORDER BY LENGTH(alphanumeric), alphanumeric 

将数字值与字母数字值混合sorting

给定input

 2a, 12, 5b, 5a, 10, 11, 1, 4b 

预期产出

 1, 2a, 4b, 5a, 5b, 10, 11, 12 

询问

 SELECT version FROM version_sorting ORDER BY CAST(version AS UNSIGNED), version; 

希望这可以帮助

我知道这个post是closures的,但我想我的方式可以帮助一些人。 所以那里是:

我的数据集非常相似,但有点复杂。 它有数字,字母数字数据:

 1 2 Chair 3 0 4 5 - Table 10 13 19 Windows 99 102 Dog 

我想首先有' – '符号,然后是数字,然后是文本。

所以我这样下去:

 SELECT name, (name = '-') boolDash, (name = '0') boolZero, (name+0 > 0) boolNum FROM table ORDER BY boolDash DESC, boolZero DESC, boolNum DESC, (name+0), name 

结果应该是这样的:

 - 0 1 2 3 4 5 10 13 99 102 Chair Dog Table Windows 

整个想法是做一些简单的检查到SELECT和sorting结果。

只要这样做:

 SELECT * FROM table ORDER BY column `name`+0 ASC 

追加+0意味着:

0,10,11,2,3,4

变成:

0,2,3,4,10,11

我讨厌这个,但是这会起作用

 order by lpad(name, 10, 0) <-- assuming maximum string length is 10 <-- you can adjust to a bigger length if you want to 

我有一些好的结果

 SELECT alphanumeric, integer FROM sorting_test ORDER BY CAST(alphanumeric AS UNSIGNED), alphanumeric ASC 

这种types的问题以前已经被问到过。

您正在讨论的sortingtypes被称为“自然sorting”。 您要对其进行分类的数据是字母数字。 最好创build一个新的列进行sorting。

为了进一步的帮助检查自然sorting在MySQL

这应该sorting字母数字字段,如:1 /数字, order by 1,2,3,4,5,6,7,8,9,10,11order by 1,2,3,4,5,6,7,8,9,10,11 … 2 /然后字段与文本,如: 1foo, 2bar, aaa11aa, aaa22aa, b5452等…

 SELECT MyField FROM MyTable order by IF( MyField REGEXP '^-?[0-9]+$' = 0, 9999999999 , CAST(MyField AS DECIMAL) ), MyField 

查询检查数据是否是一个数字,如果不是把它放到9999999999,那么先在这个列上sorting,然后再按数据sorting

祝你好运!

SELECT s.id,s.name,LENGTH(s.name)len,ASCII(s.name)ASCCCI FROM table_name s ORDER BY ASCCCI,len,NAME ASC;

我认为你的列的数据types是文本或其他东西不正确sorting。 改变它为int,bigint,像数字types浮动,所以它会正常工作…

 SELECT * FROM table ORDER BY column name ASC