|
Publicité ' | |||||||||||||||||||||||
|
|
#1 | ||
|
Futur Membre du Club
![]() Inscription : mai 2008 Messages : 52 ![]() |
Bonjour,
je suis face à une situation plus que classique : j'ai deux tables A et B associées l'une à l'autre par une table de relation a_has_b . Un élément de A est associé à plusieurs lignes dans B. Mon objectif est pour une ligne donnée de A, obtenir cette ligne plus l'ensemble des champs `noms` des lignes de B correspondantes concaténés entre eux et séparés par une virgule. Ex : ---------------------- | id | b_names | ---------------------- | 10 | toto, tata | ---------------------- Ce problème étant j'imagine très courant, je suppose qu'il doit y avoir un pattern pour le résoudre non ?Voilà la manière dont je procède : Code :
Y-a-til une solution plus élégante ? |
||
|
|
00
|
|
|
#2 |
![]() ![]() ![]() Cédric DuprezInscription : avril 2002 Messages : 3 823 ![]() |
Bonjour,
Oui. La solution la plus élégante, et la plus logique, consiste à ne pas utiliser le SQL pour tous ces problèmes de cosmétique des données (le SQL n'est pas fait pour ça), mais à utiliser le langage qui interroge la base pour réaliser ces opérations (PHP par exemple). C'est effectivement une question récurrente, à laquelle un tutoriel apporte des réponses très pertinentes : http://sqlpro.developpez.com/cours/sqlaz/erreurs/#L9 ced
__________________
Rédacteur / Modérateur SGBD Mes tutoriels et la FAQ MySQL ---------------------------------------------------- Pensez aux balises code et au tag Je ne réponds pas aux questions techniques par message privé, les forums sont là pour ça
|
|
|
20
|
|
|
#3 |
|
Futur Membre du Club
![]() Inscription : mai 2008 Messages : 52 ![]() |
ok merci beaucoup pour cette réponse précise, je vais prendre le temps de lire la page en entier de manière attentive.
En fait, j'étais convaincu de bien faire en m'évertuant à écrire des requêtes complexes pour en limiter au maximum le nombre Or, la situation que je présente est courante lors de la réalisation de site Web, ne serait-ce par exemple que pour joindre des pages et des catégories. Il me semble que si je voulais ré-écrire mes éléments de 'cosmétiques' en PHP, je serais obligé de casser les sous requêtes en une multitude de petites requêtes indépendantes... J'ai tenté de regarder dans des CMS populaires la manière dont le problème est traité, mais l'utilisation de plus en plus répandue d'ORM rend tout ça assez illisible . Existe-t-il un moyen de passer la cosmétique côté PHP en ne faisant qu'une seule requête ? Le temps gagné par l'utilisation d'une requête unique est-il réel (ie: si le SGBD met plus temps que PHP à faire la cosmétique... c peut-être simplement contre-productif)? |
|
|
00
|
|
|
#4 | |
|
Futur Membre du Club
![]() Inscription : mai 2008 Messages : 52 ![]() |
bon désolé de flooder, mais je viens de lire en détail la question sur la cosmétique et les choses sont beaucoup plus claires...
Citation:
. Cette requête unique suffira, fin du problème.Je suis un peu fatigué là, je la poserais demain et mettrais le sujet en résolu. Merci encore
|
|
|
|
00
|
|
|
#5 | ||||
|
Futur Membre du Club
![]() Inscription : mai 2008 Messages : 52 ![]() |
Bon, c fait. Voilà la requête :
Code :
mais contenant bien toutes les infos requises (en vrai je ne mets pas * mais je liste les colonnes qui m'intéresse).Côté PHP : Code :
Pour chaque ligne j'écrase les colonnes ayant les mêmes infos, et je place dans un tableau celle qui varie. Comment auriez vous fait ? |
||||
|
|
00
|
|
|
#6 |
![]() ![]() ![]() Cédric DuprezInscription : avril 2002 Messages : 3 823 ![]() |
Là, ça devient plus un problème de PHP...
ced
__________________
Rédacteur / Modérateur SGBD Mes tutoriels et la FAQ MySQL ---------------------------------------------------- Pensez aux balises code et au tag Je ne réponds pas aux questions techniques par message privé, les forums sont là pour ça
|
|
|
00
|
|
|
#7 | |||||||||||
![]() ![]() Inscription : septembre 2010 Messages : 7 103 ![]() |
avec PDO, tu peux faire ça très facilement (et proprement) grâce au FETCH_GROUP
J'ai mis un exemple ici : Citation:
__________________
http://blog.stealth35.com/ |
|||||||||||
|
|
00
|
|
|
#8 | ||||||||||||
|
Futur Membre du Club
![]() Inscription : mai 2008 Messages : 52 ![]() |
Citation:
Pour des problématiques aussi basiques que celles-là, j'aimerais savoir quelles sont les bonnes pratiques. |
||||||||||||
|
|
00
|
|
|
#9 | |
![]() ![]() Inscription : septembre 2010 Messages : 7 103 ![]() |
Citation:
__________________
http://blog.stealth35.com/ |
|
|
|
00
|
|
|
#10 |
|
Futur Membre du Club
![]() Inscription : mai 2008 Messages : 52 ![]() |
|
|
|
00
|
|
|
#11 |
![]() ![]() Inscription : septembre 2010 Messages : 7 103 ![]() |
de faire un groupe concat
__________________
http://blog.stealth35.com/ |
|
|
00
|
|
|
#12 | ||
|
Futur Membre du Club
![]() Inscription : mai 2008 Messages : 52 ![]() |
lol. ok désolé.
En fait, ce problème là est résolu puisque ced m'a expliqué que la cosmétique n'avait pas sa place côté SQL (et j'imagine donc que FETCH_GROUP de PDO rentre dans ce cadre). J'ai donc fait une nouvelle requête SQL, la plus simple que possible, et passé la cosmétique côté PHP avec : Code :
Encore une fois, comme il s'agit d'un problème très basique et très récurent, ce que j'aimerais savoir c'est quelle est la bonne pratique pour ce problème. Il doit bien y avoir une solution type ultra-propre recommandées et utilisée par tous non ? Un peu comme pour les pattern en POO ? |
||
|
|
00
|
|
|
#13 |
![]() ![]() Inscription : septembre 2010 Messages : 7 103 ![]() |
euh oui avec le FETCH_GROUP...
__________________
http://blog.stealth35.com/ |
|
|
00
|
Copyright © 2000-2012 - www.developpez.com