我的mysql排序有问题。我的查询:
SELECT * FROM versions ORDER BY version DESC
它列出了一些这样的版本:
25.0.1364.86
25.0.1364.124
23.0.1271.100
但是 0.124 高于 0.86。
我该如何解决?
我的mysql排序有问题。我的查询:
SELECT * FROM versions ORDER BY version DESC
它列出了一些这样的版本:
25.0.1364.86
25.0.1364.124
23.0.1271.100
但是 0.124 高于 0.86。
我该如何解决?
对@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 |
如果列的格式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 |
聚会迟到了,但使用 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
这是我的方法(希望你不介意我在博客上写过):
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 |
在不知道如何versions
定义表的情况下很难确定答案,但看起来它正在作为文本进行搜索,在这种情况下 86 大于 124(想想字典排序)。一种简单的解决方案可能是将数据以两种格式存储在表中 - 保留您似乎拥有的字符串,并具有等效的十进制数,例如 25.0.1364.86 作为字符串和 2501364.86 作为十进制。这将确保您的订购按预期工作。