sql сортировать по числовому тогда по алфавиту - PullRequest
1 голос
/ 07 октября 2010

в этом примере:

10-20
20-40
50-60

v
k
r
a

12 month
1 month

как мне отсортировать его в этом порядке?:

10-20
20-40
50-60

a
k
r
v

1 month
12 month

я использую abs (значение), но в алфавитном случае не работает

Ответы [ 2 ]

2 голосов
/ 07 октября 2010

Если вы можете выполнить какую-то обработку в PHP, вы можете использовать natsort:

Standard sorting
Array
(
    [3] => img1.png
    [1] => img10.png
    [0] => img12.png
    [2] => img2.png
)

Natural order sorting
Array
(
    [3] => img1.png
    [2] => img2.png
    [1] => img10.png
    [0] => img12.png
)

В противном случае есть еще один вопрос о SO, который задает то же самое: Естественная сортировка в MySQL

1 голос
/ 07 октября 2010

ОК, спасибо комментатору, теперь рабочая версия. Это сортирует по двум случаям в следующем порядке:

select  *
from    (
        select '10-20' as col1
        union all select '20-40'
        union all select '50-60'
        union all select 'v'
        union all select 'k'
        union all select 'r'
        union all select 'a'
        union all select '12 month'
        union all select '1 month'
        ) s1
order by
        case
            when col1 rlike '[0-9][0-9]-[0-9][0-9]' then 1
            when col1 rlike '[0-9]+ month' then 3
            else 2
        end
,       case
            when col1 rlike '[0-9][0-9]-[0-9][0-9]' then cast(col1 as decimal)
            when col1 rlike '[0-9]+ month' then cast(col1 as decimal)
            else col1
        end

В первом случае категории располагаются по порядку: сначала 00-00, затем другие элементы и, в конце месяца. Во втором случае столбцы преобразуются в десятичные, если это возможно.

...