Mysql 当我的列字符串包含字母时,如何使用像列int这样的按列字符串排序?

Mysql 当我的列字符串包含字母时,如何使用像列int这样的按列字符串排序?,mysql,sql,Mysql,Sql,我有一张像这样的桌子: ------------------ | ID | Animal | ------------------ | 1 | B1 | ------------------ | 2 | B2 | ------------------ | 3 | B3 | ------------------ | 4 | B4 | ------------------ | 5 | B5 | ----------

我有一张像这样的桌子:

------------------
| ID  |  Animal  |
------------------
|  1  |    B1    |
------------------
|  2  |    B2    |
------------------
|  3  |    B3    |
------------------
|  4  |    B4    |
------------------
|  5  |    B5    |
------------------
|  6  |     1    |
------------------
|  7  |     2    |
------------------
|  8  |    R71   |
------------------
|  9  |    R72   |
------------------
|  10  |    4    |
------------------
| 11   |    7    |
------------------
| 12   |    R1   |
------------------
| 13   |    77   |
------------------
| 14   |    3    |
------------------
| 15   |    5    |
------------------
| 16   |    R2   |
------------------
| 17   |    T3   |
------------------
| 18   |    C50  |
------------------
| 19   |    R5   |
------------------
| 20   |    R6   |
------------------
我的数据库是共享托管的,我没有任何可能设置新的配置,直到上周,我对animal+0 ASC的最终订单的查询按顺序返回结果,如:B1…B5,R1…R72,1…700。昨天,我们的数据库以相同的查询无序地返回了所有结果,而在developer DB中,它像往常一样有序地返回

我咨询了主机服务,但它确认DB没有问题,并且没有新的配置

我尝试使用CAST()和CONVERT()函数,但它返回的是animal-disorder


有人能解释一下这个问题吗?

假设初始字符串只有一个字母,并且数字没有零填充,您可以执行以下操作:

order by (case when left(animal, 1) not between '0' and '9'
               then left(animal, 1) else 'ZZ'
          end),
         length(animal) desc,
         animal

如果初始字符串较长,您仍然可以执行类似操作,但逻辑要复杂一些。

对于此示例数据,这将起作用:

SELECT * 
FROM tablename
ORDER BY Animal + 0, 
         CASE WHEN Animal + 0 = 0 THEN LEFT(Animal, 1) END,
         CASE WHEN Animal + 0 = 0 THEN SUBSTR(Animal, 2) + 0 END
请参阅。
结果:


您想要什么样的订单?你能把预期的结果加到问题上吗?早上好,@Mureinik先生。我想得到像B1…B5,R1…R72,1…700(ASC);或R72…R1,B5…B1,700…1(描述)。谢谢。谢谢你,戈登·林诺夫先生。我尝试了您的方法,但返回“Erro SQL(1064):您的SQL语法有错误;请查看与您的MySQL服务器版本对应的手册,以获得正确的语法使用方法”)。也许Ia犯了些错误。@gmc\u pecas。语法很好:。@gmc_pecas。我很惊讶你没有接受这个答案,假设它真的做了你想做的事(我认为它做了)@戈登·林诺夫,对不起。我应该提到这个例子:我试图在另一个数据库中应用您的模型,它返回类似的结果。谢谢,非常感谢,福帕斯先生。我试过你的方法,成功了。说真的,我不明白这是怎么发生的,但我会学习(笑)。我读了手册,不明白发生了什么。此处:。请参阅:当我按动物id ASC编写命令时,它会将结果有序地返回给。但无论我是否更改ASC por DESC,该顺序仅适用于带有字母(A…Z)的动物名称。我用DESC尝试了你的方法,它返回了相同的结果。我不明白。。。(笑)非常感谢!@forpas先生,请参见dedemo,在您的方法中添加ID和DESC:。据我所知,你想先对所有非数字动物进行排序,然后对数字动物进行排序。是的,福帕斯先生。我用他是因为这是一个索引。我明白,阅读手册会有所帮助。我的英语不是很好。。。这就像是“在黑暗中射击”(葡萄牙语术语的自由翻译)。
> ID | Animal
> -: | :-----
>  1 | B1    
>  2 | B2    
>  3 | B3    
>  4 | B4    
>  5 | B5    
> 18 | C50   
> 12 | R1    
> 16 | R2    
> 19 | R5    
> 20 | R6    
>  8 | R71   
>  9 | R72   
> 17 | T3    
>  6 | 1     
>  7 | 2     
> 14 | 3     
> 10 | 4     
> 15 | 5     
> 11 | 7     
> 13 | 77