如何使用MySQL查询进行自然排序,我想要排序的东西以字母开头?

时间:2016-11-19 20:17:42

标签: mysql sorting

我有以下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可以替换为其他字符。

2 个答案:

答案 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))

这是做什么的?

  1. 从您的数据开始,例如RW123 ...
  2. 它会颠倒您的此列中字符的顺序。 321WR
  3. 通过向其添加0,它将其转换为数字,从而擦除现在尾随的字母。 321
  4. 它将该数字转换回字符串。 321
  5. 它再次反转该字符串123
  6. 通过向该字符串添加0,它再次将其作为数字投射。 123
  7. 按该号码排序(作为数字,而不是字符串)。
  8. 告诉你它是一个黑客。

    如果您有一堆不同的字母前缀,并且想要使用词汇顺序排序,然后使用数字,则需要此模式。

           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))
    

    如果您在代码中使用它,请写一条评论给您的继任者解释。