3

我的mysql排序有问题。我的查询:

SELECT * FROM versions ORDER BY version DESC

它列出了一些这样的版本:

25.0.1364.86
25.0.1364.124
23.0.1271.100

但是 0.124 高于 0.86。

我该如何解决?

4

5 回答 5

3

对@peterm 发布的查询的一个小改进(感谢!)

SELECT *
FROM `versions`
ORDER BY 1*SUBSTRING_INDEX(version, '.', 1) asc, 
     1*SUBSTRING_INDEX(SUBSTRING_INDEX(version, '.', -3),'.', 1) asc, 
     1*SUBSTRING_INDEX(SUBSTRING_INDEX(version, '.', -2),'.', 1) asc, 
     1*SUBSTRING_INDEX(version, '.', -1) asc,
     version asc # this will sort non-numeric strings

我用更复杂的值、字母、数字、破折号和点进行了测试,因为版本可以用任何格式编写。

| version |
-----------
| a-b     |
| a-c     |
| ab      |
| b       |
| c       |
| c.a     |
| c.a.b   |
| c.b     |
| c.b.a   |
| c.b.b   |
| ca      |
| 1.2     |
| 1.2.1   |
| 2.1.1   |
| 2.1.2   |
| 3       |
| 10      |
| 123     |
于 2013-07-25T09:13:22.870 回答
2

如果列的格式version是固定的,那么您可以将版本拆分为多个部分ORDER BY

SELECT *
FROM versions
ORDER BY 1*SUBSTRING_INDEX(version, '.', 1) DESC, 
         1*SUBSTRING_INDEX(SUBSTRING_INDEX(version, '.', -3),'.', 1) DESC, 
         1*SUBSTRING_INDEX(SUBSTRING_INDEX(version, '.', -2),'.', 1) DESC, 
         1*SUBSTRING_INDEX(version, '.', -1) DESC

输出:

|       VERSION |
-----------------
| 25.0.1364.124 |
| 25.0.1364.86  |
| 23.0.1271.100 |

SQLFiddle

于 2013-03-12T23:57:10.953 回答
1

聚会迟到了,但使用 INET_ATON() 函数有一个更简单的答案。

SELECT * FROM versions ORDER BY INET_ATON(version)

将输出

23.0.1271.100
25.0.1364.86
25.0.1364.124

在此处阅读有关 INET_ATON() 的更多信息:http: //dev.mysql.com/doc/refman/5.0/en/miscellaneous-functions.html#function_inet-aton

于 2015-09-24T16:30:18.920 回答
0

这是我的方法(希望你不介意我在博客上写过):

SELECT v.version 
FROM   (SELECT version, 
               Cast(Substring_index(version, '.', 1) AS UNSIGNED INTEGER)  major, 
               Cast(Substring_index(Substring_index(version, '.' 
                   , 2 ), '.', -1) AS UNSIGNED INTEGER)                    minor, 
               Cast(Substring_index(Substring_index(version, '.' 
                   , -2 ), '.', 1) AS UNSIGNED INTEGER)                    patch, 
               Cast(Substring_index(version, '.', -1) AS UNSIGNED INTEGER) build 
        FROM   versions) v 
ORDER  BY v.major, 
          v.minor, 
          v.patch, 
          v.build

结果

| 版本 |
-----------------
| 23.0.1271.100 |
| 25.0.1364.86 |
| 25.0.1364.124 |

查看演示

于 2013-03-13T00:32:27.500 回答
0

在不知道如何versions定义表的情况下很难确定答案,但看起来它正在作为文本进行搜索,在这种情况下 86 大于 124(想想字典排序)。一种简单的解决方案可能是将数据以两种格式存储在表中 - 保留您似乎拥有的字符串,并具有等效的十进制数,例如 25.0.1364.86 作为字符串和 2501364.86 作为十进制。这将确保您的订购按预期工作。

于 2013-03-12T23:40:25.643 回答