【问题标题】:mysql natural sortingmysql 自然排序
【发布时间】:2026-01-22 19:15:01
【问题描述】:

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

srv1,srv10,srv11,srv2,srv6

但我需要像 srv1,srv2,srv6,srv10,srv11 这样的结果

我知道的一个想法是

ORDER BY LENGTH(name), name

但我的姓名栏长度不同

我需要做什么?

【问题讨论】:

标签: mysql sorting natural-sort


【解决方案1】:

你可以试试这个:

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

【讨论】:

  • @VeroLom:很高兴帮助你:)
【解决方案2】:

自然排序在 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;

获得更稳健的方法。

【讨论】:

  • 谢谢,但我的名字没有单一模板(可能是 host#、sw#、csw# 等)
  • 在这种情况下,您应该为每个服务器在prefix 列中添加相应的前缀,使用order by prefix asc, parsed_num asc 子句
  • 如果您在数据库中输入不同的服务器名称(如host###sw### 等),则先前的答案解决方案将根本行不通,因为它将假定前缀始终为3 个字符长。尝试我建议的方法,然后告诉我它是否适合您。