id| name | created_at
—-----------------------------
1 | name 1 | 2017-05-20
2 | name 2 | 2017-05-22
3 | name 66 | 2017-05-24
4 | name 44 | 2017-05-25
我有一张桌子订单
我必须在名称列中按数字对其进行排序
喜欢
id| name | created_at
—-----------------------------
1 | name 66 | 2017-05-20
2 | name 44 | 2017-05-22
3 | name 2 | 2017-05-24
4 | name 1 | 2017-05-25
我尝试过SELECT * FROM Orders ORDER BY name DESC;
,但是没有运气;
我该怎么做?
答案 0 :(得分:1)
如果所有名称的格式均为name, space, number
,则可以使用此查询。 SUBSTRING_INDEX
从最后一个空格到末尾提取字符,然后将它们CAST
作为一个无符号整数,以便对它们进行排序。
SELECT *
FROM Orders
ORDER BY CAST(SUBSTRING_INDEX(name, ' ', -1) AS UNSIGNED) DESC
输出:
id name created_at
3 name 66 2017-05-24
4 name 44 2017-05-25
2 name 2 2017-05-22
1 name 1 2017-05-20
答案 1 :(得分:0)
有一个简单的技巧可以做到这一点,即先按长度排序,然后按名称排序。示例:
SELECT *
FROM Orders
ORDER BY LENGTH(name) DESC, name DESC
以下是实际操作的示例:SQL Fiddle
编辑:请注意,仅当您的字符串与示例数据中的字符串一致时,他的才会起作用。
答案 2 :(得分:0)
以下查询使用子字符串功能提取名称列中的数字,然后进行相应排序。
SELECT *
FROM Orders
ORDER BY CAST(SUBSTRING(name, length('name')+2 , 3) AS UNSIGNED) DESC
答案 3 :(得分:0)
如果'name'
的每一行都不相同,则可以执行以下操作:
order by substring_index(name, ' ', 1),
substring_index(name, ' ', -1) + 0
如果您具有以下值,这将起作用:
a 1
a 2
a 10
b 1
b 100
(当然,当然也都以“ name”开头)