SQL按列中的数字排序

时间:2018-08-10 08:40:55

标签: mysql sql

 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;,但是没有运气;

我该怎么做?

4 个答案:

答案 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”开头)