我有server(id,name,ip)
这样的表格。当我尝试按名称对结果进行排序时,我得到:
srv1,srv10,srv11,srv2,srv6
但我需要像srv1,srv2,srv6,srv10,srv11
我知道的一个想法是
ORDER BY LENGTH(name), name
但我在名称列中有不同的长度
我需要做什么?
答案 0 :(得分:6)
你可以试试这个:
SELECT id,name,ip,CONVERT(SUBSTRING(name FROM 4),UNSIGNED INTEGER) num
ORDER BY num;
答案 1 :(得分:1)
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;
正如我所说,这种方法非常具体,因为你假设要忽略前3个字符。如果您更改模板,这可能会产生误导并且难以处理。
您可以选择向表中添加一个列,让我们称之为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;
获得更强大的方法。