MySQL естественная сортировка - PullRequest
2 голосов
/ 10 мая 2011

У меня есть таблица, как server(id,name,ip).Когда я пытаюсь отсортировать результаты по имени, я получаю:

srv1,srv10,srv11,srv2,srv6

, но мне нужны результаты типа srv1,srv2,srv6,srv10,srv11

Одна идея, которую я знаю, это

ORDER BY LENGTH(name), name

но у меня разные длины в столбце имени

Что мне нужно сделать?

Ответы [ 2 ]

6 голосов
/ 10 мая 2011

Вы можете попробовать это:

SELECT id,name,ip,CONVERT(SUBSTRING(name FROM 4),UNSIGNED INTEGER) num
ORDER BY num;
1 голос
/ 10 мая 2011

Естественная сортировка не реализована в 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;

для получения более надежного подхода.

...