2010-10-06 13 views
1

dans cet exemple:sql tri numérique puis par ordre alphabétique

10-20 
20-40 
50-60 

v 
k 
r 
a 

12 month 
1 month 

Comment puis-je trier dans cet ordre:

10-20 
20-40 
50-60 

a 
k 
r 
v 

1 month 
12 month 

i utilise abs (valeur), mais dans le cas alphabétique ne travail

+0

est-il 1 exemple ou 3 exemples? –

+0

il est 1 exemple – cosy

+1

duplication possible de [Natural Trier dans MySQL] (http://stackoverflow.com/questions/153633/natural-sort-in-mysql) – jball

Répondre

1

OK, merci à l'intervenant, maintenant une version de travail. Ce trie sur deux cas dans l'ordre par article:

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 

Le premier cas met les catégories dans l'ordre: 00-00, puis d'autres choses, et à la fin des mois. Le deuxième cas convertit les colonnes en décimal si possible.

+0

Cela met "2" après "10" – nickf

2

Si vous pouvez vous contenter de faire un peu de traitement en PHP, vous pouvez utiliser 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 
) 

Sinon, il y a une autre question sur le SO qui demande la même chose: Natural Sort in MySQL