繁体   English   中英

mysql自然排序

[英]mysql natural sorting

我有像server(id,name,ip) 当我尝试按名称对结果进行排序时,我得到:

srv1,srv10,srv11,srv2,srv6

但我需要像srv1,srv2,srv6,srv10,srv11

我知道的一个主意是

ORDER BY LENGTH(name), name

但我在名称栏中有不同的长度

我需要做什么?

你可以试试这个:

SELECT id,name,ip,CONVERT(SUBSTRING(name FROM 4),UNSIGNED INTEGER) num
ORDER BY num;

在MySQL中未实现自然排序。 你应该尝试不同的方法。 在此示例中,我假设服务器名称始终具有相同的模板(即srv ###)。

select
    name, 
    mid(name, 4, LENGTH(name)-3) as num, 
    CAST(mid(name, 4, LENGTH(name)-3) AS unsigned) as parsed_num 
from server
order by parsed_num asc;

如我所说,这种方法非常具体,因为您假定前三个字符将被忽略。 如果您更改模板,这可能会产生误导且难以处理。

您可以选择在表中添加一列,我们称其为prefix ,您可以在其中设置服务器的前缀名称(在您的示例中,每个服务器的名称均为srv )。 然后你可以使用:

select
    name,
    prefix,
    mid(name, LENGTH(prefix) + 1, LENGTH(name)-LENGTH(prefix)) as num, 
    CAST(mid(name, LENGTH(prefix) + 1, LENGTH(name)-LENGTH(prefix)) AS unsigned) as parsed_num  
from server
order by parsed_num asc;

获得更强大的方法。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM