2014-11-08 146 views
0

我有版本号的表在MySQL数据库的程序,这样的组织:MySQL的顺序按版本号+姓名

versionnumber 
---- 
1.4.0 
1.5.0 
1.6 
1.6.1 
1.6.2 
1.7DevBuild1 
1.7DevBuild2 
1.7DevBuild3 
1.7 
1.8 

我抬起头如何通过版本号命令,用点,在MySQL查询,并在SO的其他地方找到了一个非常有创意的解决方案

SELECT * 
FROM versions 
ORDER BY INET_ATON(SUBSTRING_INDEX(CONCAT(versionnumber,'.0.0.0'),'.',4)) 

这可以通过订购版本号,就好像它是INET_ATON中的IP地址一样工作。有用。有点。它正确地组织版本号,但它不能识别Dev版本,而是将它们放在最前面并忽略它们,因为它们包含文本,IP地址不应该包含这些文本。

1.7DevBuild1 
1.7DevBuild2 
1.7DevBuild3 
1.4.0 
1.5.0 
1.6 
1.6.1 
1.6.2 
1.7 
1.8 

所以我有一个想法:将所有字母a-z替换为空白,这样它将只包含数字和点。但MySQL不能代替RegExp。有没有其他的方法,或者我必须在PHP中对返回的数组进行排序?

现在,有人可能会建议将“DevBuild3”更改为“.3”,但那些查找旧版本的用户将看到“.3”而不是“DevBuild3”。

+1

如果你想这样做在MySQL,我认为你必须写一个UDF,用做内置函数繁重。将未排序的数据返回给PHP并使用'usort()'可能会更容易。 – Barmar 2014-11-08 23:08:24

+0

这是一个潜在的解决方案。 – tomysshadow 2014-11-08 23:26:18

回答

3

如果你可以拆分成versionnumber两列,versionnumberversionsuffix,你可以使用:

ORDER BY INET_ATON(SUBSTRING_INDEX(CONCAT(versionnumber,'.0.0.0'),'.',4)), versionsuffix 
+0

这真的很好!标记为正确的,因为它的工作。 – tomysshadow 2014-11-08 23:28:14