MYSQL - ORDER BY带括号的数字列

时间:2014-12-18 21:52:53

标签: mysql

我有一个包含图书清单的旧数据库。每本书都有一个卷号。卷可以是第1部分和第2部分。因此,我有这些卷号的书籍:

1
2
3
...
29 (1)
29 (2)
30 (1)
30 (2)

我需要以DESC顺序选择所有卷,按卷号列排序。最初我做了这个动态铸造:

SELECT * FROM volumenes ORDER BY volumen_numero * 1 DESC

哪个很好直到它达到30!出于某种原因,它现在返回:

30 (1)
30 (2)
29 (2)
29 (1)
... all sorted correctly from this point on

我尝试从列值中替换括号,如下所示:

ORDER BY CAST(replace(replace(volumen_numero,")",""), "(", "") as unsigned)

但我得到完全相同的结果。

我正在寻找的是这个订单:

30 (2)
30 (1)
29 (2)
29 (1)
...

Here you have a working SQL Fiddle

2 个答案:

答案 0 :(得分:1)

问题是您只按第一个数字排序。这是一个更明确的方法:

order by substring_index(volumen_numero, ' ', 1) + 0,
         substring_index(volumen_numero, ' ', -1)

只要卷号为一位数,上述操作就可以正常工作。您可以使用以下方法处理更长的卷号:

order by substring_index(volumen_numero, ' ', 1) + 0,
         length(substring_index(volumen_numero, ' ', -1)),
         substring_index(volumen_numero, ' ', -1)

或者,如果你喜欢隐秘而且更短:

order by volumen_numero + 0,
         substring_index(volumen_numero, '(', -1) + 0

答案 1 :(得分:1)

你应该在你的选择中调试会发生什么。 (将订单表达式添加到选择并验证它。)

我猜这个空间扰乱了整数转换。 (可能第二部分将被截断。) 如果这个假设成立,你可以轻松解决它:

ORDER BY CAST(replace(replace(replace(volumen_numero,")",""), "(", "")," ","") as unsigned)