mysql排序版本号

rak*_*esh 17 mysql sorting

我有以下价值观:

1.1.2 
9.1 
2.2
4
1.2.3.4
3.2.14
3.2.1.4.2
.....
Run Code Online (Sandbox Code Playgroud)

我需要使用mysql对这些值进行排序.这个的数据类型是varbinary(300).

所需的输出如下:

1.1.2
1.2.3.4
2.2
3.2.1.4.2
3.2.14
4
9.1
Run Code Online (Sandbox Code Playgroud)

查询是:

select version_number from table order by version_number asc 
Run Code Online (Sandbox Code Playgroud)

它没有给出正确的排序顺序.

所需的输出是:

1.1.2
1.2.3.4
2.2
3.2.1.4.2
3.2.14 
4
9.1
Run Code Online (Sandbox Code Playgroud)

版本号最多为20位(如1.2.3.4.5.6.7.8.9.2.34)以及更多.没有特定的最大尺寸,标准版本就像上面提到的那样.

Tri*_*onX 39

尝试滥用INET_ATON函数进行排序,如下所示:

SELECT version_number FROM table ORDER BY INET_ATON(SUBSTRING_INDEX(CONCAT(version_number,'.0.0.0'),'.',4))
Run Code Online (Sandbox Code Playgroud)

这个技巧最初发布在mysql邮件列表上,非常感谢原版海报Michael Stassen!

这就是他要说的话:

如果每个部分不大于255,您可以利用INET_ATON()来执行您想要的操作(直到第4部分).通过使用CONCAT添加'0.0.0'以确保每行至少有4个部分,然后SUBSTRING_INDEX仅拉出前4个部分,诀窍是使这些看起来像IP.

现在,我必须指出,因为我们正在对列的函数进行排序,而不是对列本身进行排序,所以我们不能使用列上的索引来帮助进行排序.换句话说,排序将相对较慢.

在后一种情况下,他建议使用类似于@spanky发布的解决方案(单独的列).


spa*_*nky 5

我将它存储在三个单独的列中,每个列对应版本号的每个部分.

使每列成为TINYINT,甚至在3列中创建索引.这应该会让事情变得简单.

然后你可以这样做: select CONCAT(v1,'.',v2,'.',v3) AS version_number FROM table ORDER BY v1 asc, v2 asc, v3 asc

  • 是的,当我发布这个,问题不包括有20位数的事实,它看起来只有3或4位数.似乎没有其他人发布答案.我是一个人,想知道为什么有人会使用20个版本号.我甚至无法想象一个场景.但是为了提供帮助,我建议做一个像@muistooshort发布的固定宽度标准化版本. (2认同)