Version complète: sur le forum Webmaster Hub : Définir un ordre de tri par rapport à des valeurs..
Webmaster Hub > Création et exploitation de Sites Internet > Les langages du Net > SQL
flo001
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
petit-ourson
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
flo001
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.
captain_torche
Tu peux faire un tri avec
SQL
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.
Kioob
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 :
CODE
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.
petit-ourson
Le plus simple est peut être aussi de faire le tri après la requête dans ton programme.

CITATION(Kioob @ mardi 2 septembre 2008 à 02:00) *
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)
captain_torche
CITATION(Kioob @ mardi 2 septembre 2008 à 02:00) *
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 wink.gif
Kioob
Clair petit-ourson wink.gif C'est pas pour rien qu'on utilise généralement une table intermédiaire tongue.gif
flo001
Bon ben c'est nikel, je vous remercie, je tire la leçon pour la prochaine fois il y aura une table intermédiaire smile.gif
Ceci est une version "bas débit" de notre forum. Pour voir la version complète avec plus d'information, la mise en page et les images, veuillez cliquer ici.