2010-10-06 2 views
1

в этом примере:SQL сортировать числовой затем в алфавитном порядке

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 (значение), но в алфавитный случае не работа

+0

является его 1 пример или 3 примера? –

+0

1 пример – cosy

+1

Возможный дубликат [Природная сортировка в MySQL] (http://stackoverflow.com/questions/153633/natural-sort-in-mysql) – jball

ответ

1

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

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, а затем другие вещи, и в конце концов месяцев. Второй случай преобразует столбцы в десятичные числа, если это возможно.

+0

Это означает, что «2» после «10» – nickf

2

Если вы можете уйти с делать некоторые обработки в 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, который спрашивает то же самое: Natural Sort in MySQL

Смежные вопросы