MySQL tri alphabétique foireux

Résolu
le_boss Messages postés 168 Date d'inscription   Statut Membre Dernière intervention   -  
le_boss Messages postés 168 Date d'inscription   Statut Membre Dernière intervention   -
Bonjour,

J'aimerais bêtement trier un champ texte par ordre alphabétique, donc je fais:

SELECT * FROM tutu ORDER BY tata

ou tata est mon champ contenant du texte. Seulement voilà, le tri me donne des choses comme ça:

a ba
a ca
aaa
ara

au lieu de:

aaa
a ba
a ca
ara

donc sitôt qu'il y a un espace, ça foire.

Y a-t-il une solution à ça ?

9 réponses

le_boss Messages postés 168 Date d'inscription   Statut Membre Dernière intervention   19
 
Bon, j'ai utilisé la solution du dernier recours... et ça marche...

Pareil pour les "«", je les ai remplacés par des "\"" et ça marche très bien maintenant.

Merci pour ton aide fiu.
1
Arya
 
ça doit être parce que la "a " (a espace) se situe avant le aa.

Par contre je ne vois pas comment faire
0
le_boss Messages postés 168 Date d'inscription   Statut Membre Dernière intervention   19
 
y a pas l'ombre d'un doute :-D

merci de le préciser tout de même...
0
fiu
 
Salut

si tu veux que ce soit trié sans les espaces, il faut demander à trier sans les espaces.

si MySQL le supporte, essaie
SELECT * FROM tutu ORDER BY REPLACE(tata, ' ', '')
si ça marche pas (normalement, on ne trie que sur une colonne présente dans les données en sortie) essaie alors
SELECT *, REPLACE(tata, ' ', '') FROM tutu ORDER BY REPLACE(tata, ' ', '')
0
le_boss Messages postés 168 Date d'inscription   Statut Membre Dernière intervention   19
 
T'es un chef ! Apparemment, MySQL supporte ta première suggestion.

Merci !

Si je peux encore profiter un peu de ton savoir... pendant que tu es là:

Comment je peux faire pour qu'en plus, il ignore les "«" placés au début de certains enregistrements ?

J'ai essayé ces deux variantes, sans succès:

SELECT * FROM tutu ORDER BY REPLACE(tata, ' ', ''), REPLACE(tata, '«', '')
SELECT * FROM tutu ORDER BY REPLACE(tata, ' ', ''), REPLACE(tata, 'chr(174)', '')
0
fiu
 
tssss

C'est pas deux expressions qu'il faut donner
1: REPLACE(tata, ' ', '')
2: REPLACE(tata, '«', '')

mais une seule: REPLACE(REPLACE(tata, '«', ''), ' ', '')
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
le_boss Messages postés 168 Date d'inscription   Statut Membre Dernière intervention   19
 
Alors désolé, mais avec ce code, seuls les espaces sont enlevés.
0
fiu
 
cool

si les espaces sont enlevés, c'est que REPLACE(tata, '«', '') ne provoque pas d'erreur !
pour te convaincre que ce REPLACE fonctionne bien, remplace donc '«' par 'a'
et comme c'est toi qui as donné «, je te laisse chercher comment l'indiquer dans le REPLACE.
0
le_boss Messages postés 168 Date d'inscription   Statut Membre Dernière intervention   19
 
Désolé, c'est moi me suis planté lamentablement avant. En fait, la requête ne contenait pas de champs avec un "«". J'ai essayé en mettant une lettre quelconque et en effet ça fonctionne. Maintenant, si j'essaie avec l'apostrophe (cette fois la requête en contient), ça me les enlève pas quand même. C'est curieux. Je rame, là.
0
fiu
 
en fait, si tu veux savoir si tu exprimes correctement tes chaines de caractères, fais donc un
select tata from tutu where tata like '%«%'
ou si je m'en tiens à ce que tu avais écrit
select tata from tutu where tata like '%||chr(174)||'%'

modifie ensuite cette requête pour essayer de chercher les tata contenant une apostrophe.
lorsque tu auras trouvé la bonne syntaxe pour exprimer une apostrophe, tu pourras alors t'en servir dans n'importe quelle fonction dont le REPLACE
0
le_boss Messages postés 168 Date d'inscription   Statut Membre Dernière intervention   19
 
Bon alors voilà ce qui se passe:

Dans ma BDD ce ne sont en fait pas des apostrophes chr(39), mais un autre caractère qui y ressemble, le chr(146) apparemment.

Lorsque je fais:
SELECT * FROM tutu WHERE tata LIKE('%’%') => c'est à dire recherche du chr(146): aucun résultat, alors que ma BDD en est remplie.

J'ai donc essayé de modifier un des enregistrements et de mettre une vraie apostrophe à la place du chr(146) et de faire une recherche sur les apostrophes, et là il me trouve l'enregistrement que je viens de modifier.

Si tu as une idée pourquoi l'un marche et pas l'autre, je suis preneur...

Ma solution de dernier recours sera de faire un export de ma table, de l'ouvrir dans un éditeur de texte et de remplacer tous les chr(146) par des vraies apostrophes précédées d'un backslash pour les échapper.
0