我有以下价值观:
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发布的解决方案(单独的列).
我将它存储在三个单独的列中,每个列对应版本号的每个部分.
使每列成为TINYINT,甚至在3列中创建索引.这应该会让事情变得简单.
然后你可以这样做:
select CONCAT(v1,'.',v2,'.',v3) AS version_number FROM table ORDER BY v1 asc, v2 asc, v3 asc