Faire un GROUP BY dans un ORDER BY FIELD ou autres solutions si vous etes super

unvolutus Messages postés 7 Date d'inscription jeudi 13 mai 2004 Statut Membre Dernière intervention 13 mai 2011 - 12 mai 2011 à 14:33
unvolutus Messages postés 7 Date d'inscription jeudi 13 mai 2004 Statut Membre Dernière intervention 13 mai 2011 - 13 mai 2011 à 11:11
Bonjour bonjour, :)

Je vous explique vite fait mon problème

J'ai une table mysql livres avec les données suivantes :
livre 1 en
livre 1 fr
livre 2 it
livre 1 it
livre 3 fr

J'essaye de faire une requete qui me renvoie les livres 1, 2 et 3 avec une langue de "préférence"(fr).
Si la langue de préférence n'existe pas, l'anglais doit etre choisis, sinon s'il n'existe pas non plus ça récupère le livre en italien, et ainsi de suite.
Toutes les livres n'existent pas forcément dans toutes les langues.
Dans mon exemple je voudrais récupérer cela : (ma langue de préférence est francais, puis anglais, puis italien)
livre 1 fr
livre 2 it
livre 3 fr

J'ai essayé avec ORDER BY FIELD(langue, "fr", "en", "it") mais ça me renvoie
livre 1 fr
livre 1 en
livre 1 it
livre 2 it
livre 3 fr

Le problème est que le livre 1 est renvoyé 3 fois. Et le problème ne se règle pas avec un GROUP BY car il est exécuté avant le tri.

S'il vous plait!!! A l'aiddddeeee

Val

6 réponses

smathis Messages postés 153 Date d'inscription lundi 22 mars 2010 Statut Membre Dernière intervention 17 juin 2011 5
12 mai 2011 à 14:53
Et si tu select des valeurs distinctes de nom de livre ? Mais j'imagine que le distinct est fait avant le tri, donc il prend le premier résultat. Et si c'est pas le même que la préférence.. Mais !
Tu prends la requête qui fourni ça : livre 1 fr
livre 1 en
livre 1 it
livre 2 it
livre 3 fr
Et tu fais ça :
SELECT distinct(nom_livre), langue
FROM (Select... ORDER BY FIELD(langue, "fr", "en", "it")) as t1(id,nom,livre, langue)
0
unvolutus Messages postés 7 Date d'inscription jeudi 13 mai 2004 Statut Membre Dernière intervention 13 mai 2011
13 mai 2011 à 08:55
Salut,
Non, ca renvoi
livre 1 fr
livre 1 en
livre 1 it
livre 2 it
livre 3 fr

:/

Du coup à la place du distinct, je met un group by à la fin sur nom_livre et je trouve les bons résultat.
Mais la doc mysql dit "N'utilisez pas cette fonctionnalité si les colonnes que vous omettez dans la clause GROUP BY ne sont pas unique dans le groupe!! Vous auriez des résultats inattendus! "
Mais apres des tests, j'ai toujours les bon résultat.
Donc je crois que je vais utiliser ca et verifier de temps en temps si les résultats sont toujours bon

En tout cas je suis toujours ouverte à toutes propositions :p
0
smathis Messages postés 153 Date d'inscription lundi 22 mars 2010 Statut Membre Dernière intervention 17 juin 2011 5
13 mai 2011 à 09:23
Comment est découpée ta table ?
Une colonne avec "Livre 1 fr", etc, ou c’est découpé en plusieurs colonnes avec d'un coté le nom "Livre 1" et une autre avec la langue ?
Le group by fait plus ou moins la même chose que distinct, en effet du coup il faut une seul valeur pour le group, mais j'imagine que sinon il prend la première valeur possible et ignore les autres, donc ça marche.
0
unvolutus Messages postés 7 Date d'inscription jeudi 13 mai 2004 Statut Membre Dernière intervention 13 mai 2011
13 mai 2011 à 09:43
Voila la forme de mes tables

tab:livre
id_livre | livre
-----------------
1 | popo
2 | lmlm
3 | bnbn

tab:langue_livre
id_langue | id_livre | langue
-----------------------------
1 | 1 | en
2 | 1 | fr
3 | 2 | en
4 | 1 | it
5 | 3 | fr

Concernant le group by, c'est justement dit que on ne peux pas savoir vraiment ce qu'il vas renvoyer.
Dans mes tests ca me renvoi toujours le premier mais ils disent que rien n'est garanti... ce qui n'est super top ;)
0

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

Posez votre question
smathis Messages postés 153 Date d'inscription lundi 22 mars 2010 Statut Membre Dernière intervention 17 juin 2011 5
13 mai 2011 à 10:51
Oui mais il doit bien exécuter le même procédé pour avoir le résultat, t'auras toujours le 1er même si t'essayes 10 000 fois.
Sinon tu fais le boulot avec ton appli et tu supprimes les doublons dans ta liste de résultat.
0
unvolutus Messages postés 7 Date d'inscription jeudi 13 mai 2004 Statut Membre Dernière intervention 13 mai 2011
13 mai 2011 à 11:11
Oui, c'etait la dernière des solutions mais ca me fait gagner pas mal d'échange entre mysql et php en filtrant avant.
Surtout qu'il y a pas mal de livre et le nombre de langue vas certainement augmenter. Donc je divise facilement la taille de l’échange par 4 aujour'hui et plus par la suite...

En tout cas merci de m'avoir mi sur la piste ;)
0
Rejoignez-nous