我有一个MySQL订购的问题。 我的查询:带小数的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订购的问题。 我的查询:带小数的MySQL订单
SELECT * FROM versions ORDER BY version DESC
它列出了一些版本是这样的:
25.0.1364.86
25.0.1364.124
23.0.1271.100
不过0.124比0.86高。
我该如何解决?
不知道表versions
是如何定义的,它很难回答,但看起来好像它正在被搜索为文本,在这种情况下,86大于124(思考字典顺序)。 一个简单的解决方案可能是将表格中的数据以两种格式存储 - 保留您似乎有的字符串,并且具有十进制等值,例如25.0.1364.86作为字符串,2501364.86作为小数。这将确保您的订购按预期工作。
如果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 |
@Skylineman你的问题需要更多帮助吗? – peterm 2013-03-17 06:52:45
这里是我的方法(希望你不介意我blogged about it):
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
结果
| VERSION | ----------------- | 23.0.1271.100 | | 25.0.1364.86 | | 25.0.1364.124 |
唯一的问题是,我们不知道版本号有多长:/ – Skylineman 2013-03-13 21:59:18
没有固定格式的版本 – Skylineman 2013-03-13 22:09:22
将其拆分应该仍然有效。 – Kermit 2013-03-14 00:06:59
小的提升,从@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 |
这太棒了,谢谢! – zoltar 2014-05-20 22:03:59
参加派对已晚,但使用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
商店作为4个整数列 - 'major','minor','patch'和'build' – zerkms 2013-03-12 23:37:28
你的问题是他们不是小数,他们是字符串。因此,他们被比作字符串。 – 2013-03-12 23:38:18
@MarkParnell什么是分辨率? – Skylineman 2013-03-12 23:39:25