|
Publicité ' | ||||||||||||||||||||||||
|
|
#1 | ||
|
Membre éprouvé
![]() Aurélien GéritsDéveloppeur Web Inscription : mai 2006 Messages : 1 045 ![]() |
Bonjour, je suis entrain de préparer mes requêtes et je souhaite savoir si on peut utiliser group_concat dans une sous requête.
Je m'explique : Je dois récupérer une série d'enregistrement dans une table et récupérer plusieurs valeur dans une autre avec un group_concat et faire une séparation par une virgule. Mais j'avoue que group_concat ne fais pas partie des fonctions les plus utilisé chez moi (mais j'aime bien me prendre la tête de temps en temps). Code :
mais je souhaite en même temps récupérer la liste des mots clés dans une autre table qui doit être séparer par une virgule. Je pense m'être planter dans la syntaxe ou peut être la manière de procéder
__________________
Au petit déjeuner, je prend du PHP et au souper du jQuery.AFUP 2009 : Bien optimiser son code pour le référencement Mon projet open source de librairie PHP 5: magix cjquery |
||
|
00
|
|
|
#2 |
|
Expert Confirmé
![]() ![]() Avcxjo MoKoRetraité Inscription : novembre 2005 Messages : 2 530 ![]() |
Saluton,
Je reste très perplexe quant à la pertinence de la démarche, mais la syntaxe de la requête me semble correcte. Quel est le problème, MySQL refuse-t-il l'emploi de GROUP_CONCAT en l'absence d'une clause GROUP BY ?
__________________
Kie lumo eksistas ankaŭ ombro troviĝas. L.L. Zamenhof articles : Comment émuler un tableau croisé [quasi] dynamique et : Une énigme mathématique résolue avec MySQL recommande l'utilisation de PDO (PHP5 Data Objects) |
|
00
|
|
|
#3 | |
|
Membre éprouvé
![]() Aurélien GéritsDéveloppeur Web Inscription : mai 2006 Messages : 1 045 ![]() |
Bonjour, je sais que je peux sans problème séparer sa en deux requêtes ce que je fais habituellement.
Mais c'est surtout pour tester et voir si c possible dans un tel cas d'utiliser group_concat Voila le message d'erreur Code :
#1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'ORDER BY idkind) AS LIST_USERS FROM mg_movies_kind_rel WHERE m.idmovies) FROM m' at line 1
Citation:
__________________
Au petit déjeuner, je prend du PHP et au souper du jQuery.AFUP 2009 : Bien optimiser son code pour le référencement Mon projet open source de librairie PHP 5: magix cjquery |
|
|
00
|
|
|
#4 | ||||||
|
Expert Confirmé
![]() Inscription : mai 2002 Messages : 1 653 ![]() |
la sous-requête
Code :
ensuite j'ai l'impression qu'avec la bonne syntaxe ca donnerai ceci : Code :
Dans le cas où vos conditions ramènes beaucoup de ligne il faudrai plutot passer par une phase de consolidation et de joindre ceci via left outer join par exemple : Code :
testez avec votre volumétrie |
||||||
|
|
00
|
|
|
#5 |
|
Expert Confirmé
![]() ![]() Avcxjo MoKoRetraité Inscription : novembre 2005 Messages : 2 530 ![]() |
Bien vu, punkoff, WHERE m.idmovies peut-être logiquement correct (m.idmovies serait testé comme un booléen) mais est syntaxiquement incomplet.
__________________
Kie lumo eksistas ankaŭ ombro troviĝas. L.L. Zamenhof articles : Comment émuler un tableau croisé [quasi] dynamique et : Une énigme mathématique résolue avec MySQL recommande l'utilisation de PDO (PHP5 Data Objects) |
|
00
|
|
|
#6 | |||||
|
Membre éprouvé
![]() Aurélien GéritsDéveloppeur Web Inscription : mai 2006 Messages : 1 045 ![]() |
Merci punkoof, j'ai tester avec les deux type histoire de me faire la main:
Première méthode: Code :
Deuxième méthode avec phase de consolidation: Code :
Citation:
__________________
Au petit déjeuner, je prend du PHP et au souper du jQuery.AFUP 2009 : Bien optimiser son code pour le référencement Mon projet open source de librairie PHP 5: magix cjquery |
|||||
|
00
|
|
|
#7 |
|
Expert Confirmé
![]() Inscription : mai 2002 Messages : 1 653 ![]() |
relisez votre sous-requête, en particulier le select
|
|
|
00
|
|
|
#8 | ||
|
Membre éprouvé
![]() Aurélien GéritsDéveloppeur Web Inscription : mai 2006 Messages : 1 045 ![]() |
ok c'est fait :
Code :
Sinon j'ai une dernière question la table mg_movies_kind_rel doit être lié avec la table mg_movies_kind_helper afin de retourner les mots avec une jointure sur l'identifiant, je suppose que faire une jointure supplémentaire dans la sous requête c'est ok ?
__________________
Au petit déjeuner, je prend du PHP et au souper du jQuery.AFUP 2009 : Bien optimiser son code pour le référencement Mon projet open source de librairie PHP 5: magix cjquery |
||
|
00
|
|
|
#9 |
|
Expert Confirmé
![]() Inscription : mai 2002 Messages : 1 653 ![]() |
tout est dans la doc :http://dev.mysql.com/doc/refman/5.5/...n_group-concat
Concernant votre sous-requete, esssayez ? |
|
|
00
|
|
|
#10 | ||
|
Membre éprouvé
![]() Aurélien GéritsDéveloppeur Web Inscription : mai 2006 Messages : 1 045 ![]() |
Voila je viens de modifier la requête en incluant ma jointure :
Code :
je vais essayer de creuser sa en tout cas grand merci, il ma fallut du temps pour comprendre
__________________
Au petit déjeuner, je prend du PHP et au souper du jQuery.AFUP 2009 : Bien optimiser son code pour le référencement Mon projet open source de librairie PHP 5: magix cjquery |
||
|
00
|
|
|
#11 |
|
Expert Confirmé
![]() Inscription : mai 2002 Messages : 1 653 ![]() |
Les deux requêtes doivent ramener le même résultat.
La différence entre les deux est que la 1ere est une requete scalaire, cad qu'elle va effectuer autant de fois la sous-requête que vosu avez de ligne retourner par la requête principale. Au vu de la jointure c'est assez performant pour quelque ligne retournée, mais ca va mettre à plat le SGBD assez vite si le nombre de ligne retourné est grand. La deuxième requête, logiquement va d'abord construire la sous-requête pusi va joindre ces résultat avec la requête principale. Du coup vous perdez un temps fixe mais qui n'augmentera pas avec la volumétrie retournée Bon sous MySql il faudrai vérifier les plans d'execution mais ça devrait être comme ceci. |
|
|
00
|
|
|
#12 | ||
|
Membre éprouvé
![]() Aurélien GéritsDéveloppeur Web Inscription : mai 2006 Messages : 1 045 ![]() |
Un test sous forme de requête scalaire :
Code :
Grand merci, j'en sais un peu plus désormais sur l'utilisation de group_concat et des sous requêtes de ce type
__________________
Au petit déjeuner, je prend du PHP et au souper du jQuery.AFUP 2009 : Bien optimiser son code pour le référencement Mon projet open source de librairie PHP 5: magix cjquery |
||
|
00
|
|
|
#13 | ||
![]() ![]() |
Si je comprends bien le sens de la requête, la liste de mots vient de mg_movies_kind_helper qui est associé à mg_movies_kind_rel qui est associé à mg_movies.
Pourquoi ne pas faire tout simplement les jointures nécessaires sans sous-requête et avec un GROUP BY général ? Code :
__________________
Philippe Leménager. Ingénieur d'étude à l'École Nationale de Formation Agronomique. Mon blog sur la conception des BDD, le langage SQL, le PHP avec Zend Framework... « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau) À la maison comme au bureau, j'utilise Mandriva Linux ou Mageïa ! Soutenons l'industrie logicielle française ! Linuxiens, comptez-vous ! |
||
|
00
|
|
|
#14 |
|
Expert Confirmé
![]() ![]() Avcxjo MoKoRetraité Inscription : novembre 2005 Messages : 2 530 ![]() |
Sur le principe, je pense que tu as raison Cinephil, cependant la jointure sur sous-requête sera plus performante car le GROUP_CONCAT et l'ORDER BY associé n'y seront exécutés qu'une seule fois.
__________________
Kie lumo eksistas ankaŭ ombro troviĝas. L.L. Zamenhof articles : Comment émuler un tableau croisé [quasi] dynamique et : Une énigme mathématique résolue avec MySQL recommande l'utilisation de PDO (PHP5 Data Objects) |
|
00
|
|
|
#15 |
![]() ![]() |
GROUP_CONCAT est une fonction de groupage non ? Donc à utiliser avec GROUP BY normalement non ?
La requête dans le SELECT est une requête corrélée non ? Une requête corrélée serait plus performante qu'une jointure ? Je pense au contraire que la sous-requête dans le SELECT va être exécutée autant de fois qu'il y a de lignes de résultat (autant de fois qu'il y a de films à retourner par la requête) alors qu'avec le GROUP BY, l'opération se fait en une seule fois au fur et à mesure de l'examen des lignes. Non ?
__________________
Philippe Leménager. Ingénieur d'étude à l'École Nationale de Formation Agronomique. Mon blog sur la conception des BDD, le langage SQL, le PHP avec Zend Framework... « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau) À la maison comme au bureau, j'utilise Mandriva Linux ou Mageïa ! Soutenons l'industrie logicielle française ! Linuxiens, comptez-vous ! |
|
00
|
|
|
#16 | |
|
Expert Confirmé
![]() ![]() Avcxjo MoKoRetraité Inscription : novembre 2005 Messages : 2 530 ![]() |
Ben justement, non. Elle crée juste une table temporaire en mémoire
C'était d'ailleurs l'avis de punkoff Citation:
__________________
Kie lumo eksistas ankaŭ ombro troviĝas. L.L. Zamenhof articles : Comment émuler un tableau croisé [quasi] dynamique et : Une énigme mathématique résolue avec MySQL recommande l'utilisation de PDO (PHP5 Data Objects) |
|
|
00
|
|
|
#17 | |
|
Expert Confirmé
![]() Inscription : mai 2002 Messages : 1 653 ![]() |
Bah testez y en a pour 5min, perso j'ai pas mysql de dispo.
La requête de Cinephil me plaie bien aussi ! edit : Citation:
En fait je penses que vous êtes d'accord mais que vous ne parlez pas de la même requête :p |
|
|
|
00
|
|
|
#18 | |||
|
Expert Confirmé
![]() ![]() Avcxjo MoKoRetraité Inscription : novembre 2005 Messages : 2 530 ![]() |
Citation:
Cependant, selon moi Code mySQL :
D'ailleurs à quoi bon puisque la "corrélation" est introduite par la clause de jointure
__________________
Kie lumo eksistas ankaŭ ombro troviĝas. L.L. Zamenhof articles : Comment émuler un tableau croisé [quasi] dynamique et : Une énigme mathématique résolue avec MySQL recommande l'utilisation de PDO (PHP5 Data Objects) |
|||
|
00
|
|
|
#19 | |
|
Expert Confirmé
![]() Inscription : mai 2002 Messages : 1 653 ![]() |
Citation:
Par contre Cinephil parlais de l'autre requête avec le sous select dans le select, et là la il y a corrélation ! |
|
|
|
00
|
|
|
#20 | |
|
Expert Confirmé
![]() ![]() Avcxjo MoKoRetraité Inscription : novembre 2005 Messages : 2 530 ![]() |
Citation:
J'en suis au 36° dessous.
__________________
Kie lumo eksistas ankaŭ ombro troviĝas. L.L. Zamenhof articles : Comment émuler un tableau croisé [quasi] dynamique et : Une énigme mathématique résolue avec MySQL recommande l'utilisation de PDO (PHP5 Data Objects) |
|
|
00
|
Copyright © 2000-2012 - www.developpez.com