Aller au contenu

Définir un ordre de tri par rapport à des valeurs..


Sujets conseillés

Posté

Salut à tous!

Voila mon problème, j'ai dans une table un champ langue qui peut avoir comme valeur "fr", "en", "all" etc...

J'aimerai définir un ordre de classement des éléments en fonction d'une date et en critère secondaire de la langue, par exemple pour toutes les vidéos du 01-09-2008 j'aimerai que l'on voit en premier les vidéos "en" puis les "fr" puis les "all", quelle est la syntaxe pour cela ?

Je vous remercie.

Flo

Posté

Je ne penses pas que tu puisses le faire sans passer par une table intermédiaire.

De toute façon, tu te rends compte du coup que ton modèle conceptuel ne tient pas la route à travers ce problème.

Je te conseil donc de créer une nouvelle table. Par exemple :

tLangues(idLangue, libelle, position) avec position étant la valeur d'apparition de la langue dans ton résultat

donc pour toi position aura la valeur 1 pour 'fr', la valeur 2 pour 'en' et la valeur 3 pour 'all'

Et ensuite ta requête ressemblera à quelques choses comme ça :

SELECT taTable.* FROM taTable INNER JOIN taTable.idLangue = tLangues.idLangue WHERE taTable.tonchampdate = '2008-09-01' ORDER BY tLangues.position

Posté (modifié)

Mince, c'est bizare que SQL ne prévoit rien pour ce genre de cas. Je ne peux malheureusement plus modifier mon organisation, cela entrainerait trop de changements, j'espére qu'il y a une alternative... merci.

Modifié par flo001
Posté

Tu peux faire un tri avec

ORDER BY date, langue

mais les tris sur la langue se feront par ordre alphabétique (soit all, en, fr).

Il y a peut-être un moyen de modifier cet ordre de tri, mais je ne vois pas comment.

Posté

Hello,

le plus propre est très certainement la table dédiée à cela, comme conseillée par petit-ourson.

Mais il y a au moins deux autres approches pas hyper clean et assez spécifiques à MySQL :

1) utiliser un champ ENUM pour tes langues. L'ordre dans lequel tu entres les valeurs sera celui utilisé pour le tri.

L'avantage c'est que c'est assez simple à mettre en place, mais l'ordre des langues sera toujours le même... et certains développeurs risquent peut être un jour de chercher pendant des heures pourquoi le champ n'est pas trié par ordre alphabétique...

2) bricoler un champ "ordre_tri" à la volée à coup de "if()", puis faire le tri là dessus. C'est très souple, et n'impactera que la/les requêtes qui nécessitent ça. Par contre boujour la soupe de nouilles pour le débugage.

Sur le principe ça donnerait un truc de ce genre :

select champA, champB, champC, if( champB = 3; 1; if( champB = 8; if( champC < 5; 3; 4 ); 2 ) ) as ordre_tri
from tableBizarre
where [...]
order by champA, ordre_tri

Cette dernière solution je ne m'en sert généralement qu'avec des booléens... ou en dernier recours.

Posté

Le plus simple est peut être aussi de faire le tri après la requête dans ton programme.

Cette dernière solution je ne m'en sert généralement qu'avec des booléens... ou en dernier recours.

J'espère qu'il ne doit pas faire de tri sur les 240 codes iso des pays ;o)

Posté
utiliser un champ ENUM pour tes langues. L'ordre dans lequel tu entres les valeurs sera celui utilisé pour le tri.

L'avantage c'est que c'est assez simple à mettre en place, mais l'ordre des langues sera toujours le même... et certains développeurs risquent peut être un jour de chercher pendant des heures pourquoi le champ n'est pas trié par ordre alphabétique...

Tu m'apprends quelque chose, là. Je vais essayer de ne pas l'oublier ;)

Veuillez vous connecter pour commenter

Vous pourrez laisser un commentaire après vous êtes connecté.



Connectez-vous maintenant
×
×
  • Créer...