Problème de tri A à L, M à Z,...

Problème de tri A à L, M à Z,... - SQL/NoSQL - Programmation

Marsh Posté le 21-01-2008 à 02:32:30    

Bonjour,
je fais un tri avec une requête MySql mais il y a un problème. Le tri est du style :

Code :
  1. SELECT * FROM table WHERE nom BETWEEN 'M' AND 'Z' ORDER BY nom


Quand je trie mon champ de A à L par exemple, je n'ai que les résultats de A à K et non jusqu'à L.
Pour remédier à ce problème, je trie de A à M et ça marche.
 
Mais là où ça bloque c'est quand je veux trier de M à Z, le tri s'effectue jusqu'à Y et pas Z. Et là pour remédier à ce problème, je cherche toujours la solution car je ne peux pas trier de M à A ou de M à zéro.
 
Quelqu'un a une solution pour que j'obtienne tous mes résultats pour le dernier tri ?
 
Merci
Max

Reply

Marsh Posté le 21-01-2008 à 02:32:30   

Reply

Marsh Posté le 21-01-2008 à 10:33:27    

rien à voir avec ton tri (order) c'est ton where qui pose problème.
ton between est strictement équivalent à:

Code :
  1. nom>='M'  AND nom<='Z'


Il s'avère que tous les noms qui commencent par Z sont supérieurs à Z.
Par exemple: 'Zorro' > 'Z'


Message édité par anapajari le 21-01-2008 à 10:33:49
Reply

Marsh Posté le 21-01-2008 à 10:45:38    

faut utiliser une fonction genre left(chaine, longueur) :
 
upper(left(nom, 1)) between 'M' and 'Z'
 
(sauf qu'il faut que tu traduises en MySQL, là c'est des noms de fonctions Oracle)

Reply

Marsh Posté le 21-01-2008 à 13:47:26    

J'ai résolu le problème mais c'est un peu moche  :lol: . Voilà ce que ça donne :

Code :
  1. SELECT * FROM table WHERE nom BETWEEN 'M' AND 'Zz' ORDER BY nom


 
Donc si j'ai un nom qui commence pas Zza..., il ne sera pas pris en compte mais c'est peu probable que je tombe dessus :D . Et au pire je pourrais mettre AND 'Zzz'.
C'est clair c'est pas très beau mais c'est la manière la plus simple que j'ai trouvé.
 
Merci beaucoup de m'avoir aiguillé !

Reply

Marsh Posté le 21-01-2008 à 13:52:49    

C'est nul comme solution.
 
En plus, à priori tu auras le même problème avec le A-L, si tu as quelqu'un dont le nom débute par un L, il ne sera dans aucune des deux listes.
 
Utilise plutôt la solution de MagicBuzz, à savoir comparer la première lettre du nom uniquement.

Reply

Marsh Posté le 21-01-2008 à 14:08:43    

A la limite, comme solution naze, autant en utiliser une propre :
 
A-L : where nom < 'M'
 
M-Z : where nom >= 'M'
 
:spamafote:

Reply

Marsh Posté le 21-01-2008 à 14:24:49    

OK ça marche la solution de MagicBuzz et effectivement c'est plus simple :)
 
Merci beaucoup

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed