-
L'utilisation de GROUP_CONCAT() invoque généralement la logique group-by et crée des tables temporaires, qui sont généralement très négatives pour les performances. Parfois, vous pouvez ajouter le bon index pour éviter la table temporaire dans une requête groupée, mais pas dans tous les cas.
-
Comme le souligne @MarcB, la limite de longueur par défaut d'une chaîne concaténée par un groupe est assez courte et de nombreuses personnes ont été confondues par des listes tronquées. Vous pouvez augmenter la limite avec group_concat_max_len .
-
Exploser une chaîne dans un tableau en PHP n'est pas gratuit. Ce n'est pas parce que vous pouvez le faire en un seul appel de fonction en PHP que c'est le meilleur pour les performances. Je n'ai pas évalué la différence, mais je doute que vous l'ayez non plus.
-
GROUP_CONCAT() est un MySQLisme. Il n'est pas largement pris en charge par d'autres produits SQL. Dans certains cas (par exemple, SQLite), ils ont une fonction GROUP_CONCAT(), mais cela ne fonctionne pas exactement de la même manière que dans MySQL, ce qui peut entraîner des bogues déroutants si vous devez prendre en charge plusieurs back-ends RDBMS. Bien sûr, si vous n'avez pas à vous soucier du portage, ce n'est pas un problème.
-
Si vous souhaitez récupérer plusieurs colonnes à partir de vos
currencies
table, alors vous avez besoin de plusieurs expressions GROUP_CONCAT(). Les listes sont-elles dans le même ordre ? Autrement dit, le troisième champ d'une liste correspond-il au troisième champ de la liste suivante ? La réponse est non -- pas à moins que vous ne spécifiiez la commande avec unORDER BY
clause à l'intérieur de GROUP_CONCAT().
Je privilégie généralement votre premier format de code, utilise un jeu de résultats conventionnel et boucle sur les résultats, en enregistrant dans un nouveau tableau indexé par l'ID client, en ajoutant les devises à un tableau. Il s'agit d'une solution simple, qui garde le SQL simple et facile à optimiser, et qui fonctionne mieux si vous avez plusieurs colonnes à récupérer.
Je n'essaie pas de dire que GROUP_CONCAT() est mauvais ! C'est vraiment utile dans de nombreux cas. Mais essayer d'établir une règle unique pour utiliser (ou éviter) n'importe quelle fonction ou fonctionnalité de langage est simpliste.