我有一个包含图书清单的旧数据库。每本书都有一个卷号。卷可以是第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)
...
答案 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)