2013-05-06 5 views
5

J'ai un tableau que je veux trier par ordre alphabétique, mais aussi par le nombre à la fin.mysql tri alphabétique et le numéro

"SELECT DISTINCT Number FROM database WHERE 1 Order By Number ASC"; 

Voici comment il trie actuellement:

Number 1 
Number 10 
Number 11 
Number 2 
Number 3 
Number 4 
Number 5 
Number 6 
Number 7 
Number 8 
Number 9 
The End 

Voilà comment je veux trier:

Number 1 
Number 2 
Number 3 
Number 4 
Number 5 
Number 6 
Number 7 
Number 8 
Number 9 
Number 10 
Number 11 
The End 
+1

On dirait que votre colonne de nombre est une valeur de chaîne. Vous pouvez essayer de le convertir en nombre entier avant de le commander –

+0

Essayez ma réponse.Cela fonctionne bien. –

+0

duplication possible de [Tri naturel dans MySQL] (http://stackoverflow.com/questions/153633/natural-sort-in-mysql) – Ejaz

Répondre

6

Ajouter une autre condition de tri:

Order By LENGTH(Number), Number; 

Cette fonctionne parce qu'un plus grand nombre est également un plus grand nombre ; Pour les nombres de même longueur, vous pouvez effectuer une comparaison textuelle, car '0' < '1' .... < '9'

+0

Cela fonctionnera-t-il toujours, parce que j'ai vraiment l'impression qu'il pourrait y avoir des pièges cachés. – Aquillo

+0

@Aquillo J'ai ajouté une explication pour expliquer pourquoi cela fonctionne. N'hésitez pas à trouver un cas où il donne les mauvais résultats :) –

+0

J'utilise cette méthode depuis des années. Ça marche! +1 – Fluitketel

0

sql dispose de fonctions permettant de convertir une chaîne en nombre entier pendant le tri.

Si vous utilisez MySQL, c'est ce que vous utilisez pour faire ce que vous voulez:

SELECT DISTINCT Number FROM database Order By CAST(Number AS UNSIGNED) ASC 

Si vous utilisez une autre base de données, vous aurez besoin de google comment lancer une colonne à une entier pour votre base de données.

Remarque: certaines des autres solutions fonctionnent ... mais sont un peu hacky, c'est-à-dire qu'elles ont l'air cool, mais pourraient ne pas fonctionner à l'avenir. Le ci-dessus exactement ce que vous voulez et comment vous êtes « censé » de le faire;)

+0

'SELECT CAST ('Nombre '0 'AS UNSIGNED'' donne '0' –

+0

Pourquoi passez-vous une chaîne avec le numéro de mot? Ne pas passer" Numéro 11 ", passer" 11 "ou la colonne intitulée" Nombre " –

+0

Essayez: 'SELECT CAST ('11 'AS UNSIGNED)' et vous obtenez correctement '11' –

2

Essayez ceci: -

SELECT distinct numberr FROM tablename Order By cast(substring(numberr,7) as unsigned int) ASC ; 

Son beau travail.

eteint: -

Number 1 
Number 2 
Number 3 
Number 4 
Number 5 
Number 6 
Number 7 
Number 10 
Number 11 
+0

Ce n'est pas un tri par ordre alphabétique. –

+1

Cela ne fonctionnera que si la chaîne au début est toujours 7 caractères ... vous ne pouvez pas le garantir. –

+0

Oui @TarynEast vous avez raison. –

0
"SELECT DISTINCT Number FROM database WHERE 1 Order By substring_index(Number,'Number',1),cast(substring_index(Number,'Number ',-1) as unsigned int) ASC"; 
+0

Que se passerait-il en cas de 'La fin'? – Aquillo

+0

@Aquillo, voulez-vous dire 'la fin' au lieu de la chaîne' Number'? – Amir

+0

Au lieu de 'Numéro 9' par exemple, comme dans l'exemple fourni. – Aquillo

0

Un peu en retard à la fête. Mais vous pouvez également utiliser une autre approche. Obtenez les résultats de la requête, puis les trier avec php. Ici, essayez ceci.

natsort($results); // results has your query results use natural sort. 
$sorted_array = array_values($the_array); // then reorder the index 

En espérant que cela aide quelqu'un. :)