我想按照下面列出的顺序(数字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
答案 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
给定输入
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)
答案 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