MySQL'Order By' – 正确地排列字母数字
我想按照下面列出的顺序(数字1-12)对以下数据项进行sorting:
1 2 3 4 五 6 7 8 9 10 11 12
但是,我的查询 – 使用order by xxxxx asc
按order by xxxxx asc
sorting的第一位高于一切:
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,11
等order 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