flo001 Posté 31 Août 2008 Posté 31 Août 2008 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 Posté 1 Septembre 2008 Posté 1 Septembre 2008 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 Posté 1 Septembre 2008 Auteur Posté 1 Septembre 2008 (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é 1 Septembre 2008 par flo001
captain_torche Posté 1 Septembre 2008 Posté 1 Septembre 2008 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.
Kioob Posté 2 Septembre 2008 Posté 2 Septembre 2008 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_trifrom tableBizarrewhere [...]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 Posté 2 Septembre 2008 Posté 2 Septembre 2008 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)
captain_torche Posté 2 Septembre 2008 Posté 2 Septembre 2008 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
Kioob Posté 2 Septembre 2008 Posté 2 Septembre 2008 Clair petit-ourson C'est pas pour rien qu'on utilise généralement une table intermédiaire
flo001 Posté 2 Septembre 2008 Auteur Posté 2 Septembre 2008 Bon ben c'est nikel, je vous remercie, je tire la leçon pour la prochaine fois il y aura une table intermédiaire
Sujets conseillés
Veuillez vous connecter pour commenter
Vous pourrez laisser un commentaire après vous êtes connecté.
Connectez-vous maintenant