web-dev-qa-db-fra.com

MySQL 'Order By' - trier correctement les caractères alphanumériques

Je souhaite trier les éléments de données suivants dans l'ordre dans lequel ils sont présentés ci-dessous (numéros 1 à 12):

 1. 
 2. 
 3. 
 4 
 5. 
 6 
 7 
 8 
 9 
 10 
 11 
 12

Cependant, ma requête - en utilisant order by xxxxx asc trie par le premier chiffre avant tout le reste:

 1 
 10 
 11 
 12 
 2 
 3. 
 4. 
 5 
 6 
 7 
 8 
 9.

Des astuces pour le trier plus correctement?

De plus, dans l’intérêt d’une divulgation complète, il pourrait s’agir d’un mélange de lettres et de chiffres (bien que ce ne soit pas le cas actuellement), par exemple:

 A1 
 534G 
 G46A 
 100B 
 100A 
 100JE 

etc....

Merci!

mise à jour: personnes demandant une requête

select * from table order by name asc
49
Shackrock

Les gens utilisent différentes astuces pour le faire. Je Google et trouver des résultats, chacun suit des astuces différentes. Regardez-les:

Modifier:

Je viens d'ajouter le code de chaque lien pour les futurs visiteurs.

Tri alphanumérique dans MySQL

Entrée donnée

1A 1a 10A 9B 21C 1C 1D

Production attendue 

Bin Way
===================================
SELECT 
tbl_column, 
BIN(tbl_column) AS binray_not_needed_column
FROM db_table
ORDER BY binray_not_needed_column ASC , tbl_column ASC

-----------------------

Cast Way
===================================
SELECT 
tbl_column, 
CAST(tbl_column as SIGNED) AS casted_column
FROM db_table
ORDER BY casted_column ASC , tbl_column ASC

Tri naturel dans MySQL

Entrée donnée

Table: test de tri 
 -------------------------- -------------
 | VARCHAR alphanumérique (75) | entier INT | 
 -------------------------- -------------
 | test1 | 1 | 
 | test12 | 2 | 
 | test13 | 3 | 
 | test2 | 4 | 
 | test3 | 5 | 
 -------------------------- -------------

Production attendue

 -------------------------- -------------
| alphanumeric VARCHAR(75) | integer INT |
 -------------------------- -------------
| test1                    | 1           |
| test2                    | 4           |
| test3                    | 5           |
| test12                   | 2           |
| test13                   | 3           |
 -------------------------- -------------

Requête

SELECT alphanumeric, integer
       FROM sorting_test
       ORDER BY LENGTH(alphanumeric), alphanumeric  

Tri des valeurs numériques mélangées avec des valeurs alphanumériques

Entrée donnée

2a, 12, 5b, 5a, 10, 11, 1, 4b

Production attendue

1, 2a, 4b, 5a, 5b, 10, 11, 12

Requête

SELECT version
FROM version_sorting
ORDER BY CAST(version AS UNSIGNED), version;

J'espère que cela t'aides

83
Jomoos

Je sais que ce message est fermé, mais je pense que mon chemin pourrait aider certaines personnes. Tiens voilà :

Mon jeu de données est très similaire mais est un peu plus complexe. Il a des chiffres, des données alphanumériques:

1
2
Chair 
3
0
4
5
-
Table
10
13
19
Windows
99
102
Dog

J'aimerais avoir le symbole '-' dans un premier temps, puis les chiffres, puis le texte.

Alors je vais comme ça:

SELECT name, (name = '-') boolDash, (name = '0') boolZero, (name+0 > 0) boolNum 
FROM table 
ORDER BY boolDash DESC, boolZero DESC, boolNum DESC, (name+0), name

Le résultat devrait être quelque chose:

-
0    
1
2
3
4
5
10
13
99
102
Chair
Dog
Table
Windows

L'idée est de faire un simple contrôle dans SELECT et de trier le résultat.

13
antoine

Faites juste ceci:

SELECT * FROM table ORDER BY column `name`+0 ASC

Ajouter le +0 signifiera que:

0, 10, 11, 2, 3, 4

devient :

0, 2, 3, 4, 10, 11

10
Andrew Odendaal

Je déteste ça, mais ceci fonctionnera

order by lpad(name, 10, 0)  <-- assuming maximum string length is 10
                            <-- you can adjust to a bigger length if you want to
7
ajreal

J'ai eu de bons résultats avec 

SELECT alphanumeric, integer FROM sorting_test ORDER BY CAST(alphanumeric AS UNSIGNED), alphanumeric ASC
4
Blouarf

Ce type de question a déjà été posé.

Le type de tri dont vous parlez s'appelle "Tri naturel" . Les données que vous souhaitez trier sont alphanumériques . Il serait préférable de créer une nouvelle colonne pour le tri.

Pour obtenir de l'aide supplémentaire, consultez natural-sort-in-mysql

1
nishantagarwal

SELECT S.id, s.name, LENGTH (s.name) len, ASCII (s.name) ASCCCI FROM nom_table s ORDER BY ASCCCI, len, NOM ASC;

0
Hosain Ahmed

Si vous avez besoin de trier une colonne alphanumérique qui n’a aucun format standard

SELECT * FROM table ORDER BY (name = '0') DESC, (name+0 > 0) DESC, name+0 ASC, name ASC

Vous pouvez adapter cette solution pour inclure la prise en charge des caractères non alphanumériques si vous le souhaitez, en utilisant une logique supplémentaire.

0
Weston Ganger

Cela fonctionne pour le type de données: Data1, Data2, Data3 ......, Data21. Signifie "Data" La chaîne est commune à toutes les lignes. 

Pour ORDER BY ASC, le tri sera parfait, Pour ORDER BY DESC ne convient pas.

SELECT * FROM table_name ORDER BY LENGTH(column_name), column_name ASC;
0
ShivBuyya