我有以下MySQL:
SELECT scott, title FROM stampitemdetails WHERE scott REGEXP '^RW[0-9]+$' ORDER BY CAST(scott AS UNSIGNED), scott;
问题是这个查询带回了我的结果,如下所示:
RW1
RW10
RW11
RW2
当它们应该是这样的时候:
RW1
RW2
RW10
RW11
当我的值以字符开头并以数字结尾时,如何进行自然排序?
如果RW
的长度可以波动,这意味着它可能是S
,或REN
,还是其他一些未知长度的字符?记住这一点。
顺便说一句,我在查询中有RegEx,因为在我的PHP代码中RW
可以替换为其他字符。
答案 0 :(得分:2)
您应该提取数字部分
SELECT scott, title
FROM stampitemdetails
WHERE scott REGEXP '^RW[0-9]+$'
ORDER BY substr(scott, 1,2), CAST(substr(scott, 3, 100) AS UNSIGNED);
答案 1 :(得分:0)
我有一个真正的黑客为你提供。
ORDER BY 0+REVERSE(CAST(0+REVERSE(scott) AS CHAR))
这是做什么的?
RW123
... 321WR
321
321
123
123
告诉你它是一个黑客。
如果您有一堆不同的字母前缀,并且想要使用词汇顺序排序,然后使用数字,则需要此模式。
ORDER BY letters, numbers
要获得第一部分,你必须只提取字母。
你可以用
做到这一点 REPLACE(scott,REVERSE(CAST(0+REVERSE(scott) AS CHAR)),'')
这将替换字符串中的数字。所以现在你需要
ORDER BY REPLACE(scott,REVERSE(CAST(0+REVERSE(scott) AS CHAR)),''),
0+REVERSE(CAST(0+REVERSE(scott) AS CHAR))
如果您在代码中使用它,请请写一条评论给您的继任者解释。