MySQL'Order By' - 正确排序字母数字

Sha*_*ock 55 mysql sql-order-by

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

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

但是,我的查询 - 首先使用order by xxxxx asc第一个数字排序:

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

有什么技巧让它更合适吗?

此外,为了充分披露,这可能是字母和数字的混合(虽然现在不是),例如:

A1
534G
G46A
100B
100A
100JE

等等....

谢谢!

更新:人们要求查询

select * from table order by name asc
Run Code Online (Sandbox Code Playgroud)

Jom*_*oos 96

人们使用不同的技巧来做到这一点.我用Google搜索并找出一些结果,每个都遵循不同的技巧.看看他们:

编辑:

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

MySQL中的Alpha数字排序

给定输入

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
Run Code Online (Sandbox Code Playgroud)

MySQL中的自然排序

给定输入

Table: sorting_test
 -------------------------- -------------
| alphanumeric VARCHAR(75) | integer 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           |
 -------------------------- -------------
Run Code Online (Sandbox Code Playgroud)

询问

SELECT alphanumeric, integer
       FROM sorting_test
       ORDER BY LENGTH(alphanumeric), alphanumeric  
Run Code Online (Sandbox Code Playgroud)

对与字母数字值混合的数值进行排序

给定输入

2a, 12, 5b, 5a, 10, 11, 1, 4b
Run Code Online (Sandbox Code Playgroud)

预期产出

1, 2a, 4b, 5a, 5b, 10, 11, 12
Run Code Online (Sandbox Code Playgroud)

询问

SELECT version
FROM version_sorting
ORDER BY CAST(version AS UNSIGNED), version;
Run Code Online (Sandbox Code Playgroud)

希望这可以帮助

  • 在这篇文章中包含更完整的信息会很棒. (12认同)
  • @showdev我已经把它包括在内,希望它可能会有所帮助:) (2认同)

小智 14

我知道这篇文章已经关闭,但我认为我的方式可以帮助一些人.那就是:

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

1
2
Chair 
3
0
4
5
-
Table
10
13
19
Windows
99
102
Dog
Run Code Online (Sandbox Code Playgroud)

我想首先使用' - '符号,然后是数字,然后是文本.

所以我这样做:

SELECT name, (name = '-') boolDash, (name = '0') boolZero, (name+0 > 0) boolNum 
FROM table 
ORDER BY boolDash DESC, boolZero DESC, boolNum DESC, (name+0), name
Run Code Online (Sandbox Code Playgroud)

结果应该是:

-
0    
1
2
3
4
5
10
13
99
102
Chair
Dog
Table
Windows
Run Code Online (Sandbox Code Playgroud)

整个想法是对SELECT进行一些简单的检查并使用结果进行排序.


And*_*aal 12

这样做:

SELECT * FROM table ORDER BY column `name`+0 ASC
Run Code Online (Sandbox Code Playgroud)

追加+0意味着:

0,10,11,2,3,4

成为:

0,2,3,4,10,11

  • @Tarik这可能是因为你使用的是`information_schema`,它们只是估计值,它们没有完全聚合. (4认同)
  • 这是非常危险的!在我的查询中,它工作正常,我对答案投了赞成票,但是当我刷新时,它没有用!然后我继续刷新查询 100 次,随机它有效,但不适用于 SAME 查询!不要依赖这个!我的表最后有一个数字,这是我的查询:SELECT TABLE_NAME FROM information_schema.TABLES WHERE TABLE_SCHEMA = 'my_database' AND TABLE_NAME LIKE '%my_table%' ORDER BY TABLE_NAME+0 DESC LIMIT 1 (2认同)

ajr*_*eal 9

我恨这个,但是会工作

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


Blo*_*arf 6

我有一些很好的结果

SELECT alphanumeric, integer FROM sorting_test ORDER BY CAST(alphanumeric AS UNSIGNED), alphanumeric ASC
Run Code Online (Sandbox Code Playgroud)


Shi*_*yya 6

这适用于数据类型:Data1、Data2、Data3 ......、Data21。表示“数据”字符串在所有行中都是通用的。

对于 ORDER BY ASC 它将完美排序,对于 ORDER BY DESC 不适合。

SELECT * FROM table_name ORDER BY LENGTH(column_name), column_name ASC;
Run Code Online (Sandbox Code Playgroud)