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
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.
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
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
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.
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
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
J'ai eu de bons résultats avec
SELECT alphanumeric, integer FROM sorting_test ORDER BY CAST(alphanumeric AS UNSIGNED), alphanumeric ASC
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
SELECT S.id, s.name, LENGTH (s.name) len, ASCII (s.name) ASCCCI FROM nom_table s ORDER BY ASCCCI, len, NOM ASC;
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.
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;