2013-03-12 55 views
3

我有一个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高。

我该如何解决?

+3

商店作为4个整数列 - 'major','minor','patch'和'build' – zerkms 2013-03-12 23:37:28

+1

你的问题是他们不是小数,他们是字符串。因此,他们被比作字符串。 – 2013-03-12 23:38:18

+0

@MarkParnell什么是分辨率? – Skylineman 2013-03-12 23:39:25

回答

0

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

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

+0

@Skylineman你的问题需要更多帮助吗? – peterm 2013-03-17 06:52:45

0

这里是我的方法(希望你不介意我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 |

See the demo

+0

唯一的问题是,我们不知道版本号有多长:/ – Skylineman 2013-03-13 21:59:18

+0

没有固定格式的版本 – Skylineman 2013-03-13 22:09:22

+0

将其拆分应该仍然有效。 – Kermit 2013-03-14 00:06:59

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  | 
+0

这太棒了,谢谢! – zoltar 2014-05-20 22:03:59