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

时间:2011-12-19 04:42:31

标签: 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

14 个答案:

答案 0 :(得分:88)

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

编辑:

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

Alpha Numeric Sorting in MySQL

给定输入

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

Natural Sorting in 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           |
 -------------------------- -------------

<强>查询

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

Sorting of numeric values mixed with alphanumeric values

给定输入

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;

希望这有帮助

答案 1 :(得分:13)

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

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

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进行一些简单的检查并使用结果进行排序。

答案 2 :(得分:10)

这样做:

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

追加+0意味着:

0, 10, 11, 2, 3, 4

成为:

0, 2, 3, 4, 10, 11

答案 3 :(得分:8)

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

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

答案 4 :(得分:4)

我用

取得了不错的成绩
SELECT alphanumeric, integer FROM sorting_test ORDER BY CAST(alphanumeric AS UNSIGNED), alphanumeric ASC

答案 5 :(得分:1)

以前曾问过这类问题。

您正在谈论的排序类型称为“自然排序”。 您要进行排序的数据是字母数字。 最好为排序创建一个新列。

进一步的帮助检查 natural-sort-in-mysql

答案 6 :(得分:1)

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

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

SELECT * FROM table_name ORDER BY LENGTH(column_name), column_name ASC;

答案 7 :(得分:1)

这是从教程点

SELECT * FROM yourTableName ORDER BY
SUBSTR(yourColumnName FROM 1 FOR 2),
CAST(SUBSTR(yourColumnName FROM 2) AS UNSIGNED);

它与该线程的另一个答案略有不同

供参考,这是原始链接 https://www.tutorialspoint.com/mysql-order-by-string-with-numbers

关于 UNSIGNED 的另一点写在这里 https://electrictoolbox.com/mysql-order-string-as-int/

虽然这也有正则表达式 https://www.sitepoint.com/community/t/how-to-sort-text-with-numbers-with-sql/346088/9

答案 8 :(得分:0)

这应该对字母数字字段进行排序,例如: 1 /仅限数字,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,则先在此列上订购,然后对带有文本的数据进行排序

祝你好运!

答案 9 :(得分:0)

选择 s.id,s.name,LENGTH(s.name)len,ASCII(s.name)ASCCCI FROM table_name s 订购ASCCCI,len,NAME ASC;

答案 10 :(得分:0)

如果您需要对没有任何标准格式的字母数字列进行排序

SELECT * FROM table ORDER BY (name = '0') DESC, (name+0 > 0) DESC, name+0 ASC, name ASC

如果需要,您可以使用其他逻辑来调整此解释以包括对非字母数字字符的支持。

答案 11 :(得分:0)

尝试按DESC订购

SELECT * FROM testdata ORDER BY LENGHT(name) DESC, name DESC

答案 12 :(得分:0)

MySQL ORDER BY以正确的顺序对字母数字进行排序

示例:

SELECT `alphanumericCol` FROM `tableName` ORDER BY 
  SUBSTR(`alphanumericCol` FROM 1 FOR 1), 
  LPAD(lower(`alphanumericCol`), 10,0) ASC

输出:

1
2
11
21
100
101
102
104
S-104A
S-105
S-107
S-111

答案 13 :(得分:0)

这是一个简单的示例。

SELECT HEX(some_col) h        
FROM some_table 
ORDER BY h