Dans MySQL, la fonction GROUP_CONCAT peut être utilisée en conjonction avec LEFT JOIN pour récupérer des données de plusieurs tables. Cependant, les utilisateurs peuvent rencontrer des problèmes de performances s'ils ne sont pas utilisés correctement.
Envisagez une base de données d'assistance avec des tableaux pour les tickets (Tickets) et les solutions (Solutions). Une requête est écrite pour récupérer tous les tickets avec leurs entrées de solution correspondantes à l'aide de l'instruction suivante :
<code class="sql">SELECT Tickets.*, GROUP_CONCAT(Solutions.solution) AS CombinedSolutions FROM Tickets LEFT JOIN Solutions ON Tickets.id = Solutions.ticket_id ORDER BY Tickets.id;</code>
Cette requête renvoie une seule ligne avec les informations du premier ticket et toutes les solutions des deux tickets. Ceci n'est pas intentionnel, car nous nous attendons à une ligne distincte pour chaque ticket avec ses solutions associées.
Pour résoudre ce problème, la requête peut être modifiée comme suit :
<code class="sql">SELECT t.*, x.combinedsolutions FROM TICKETS t LEFT JOIN ( SELECT s.ticket_id, GROUP_CONCAT(s.solution) AS combinedsolutions FROM SOLUTIONS s GROUP BY s.ticket_id ) x ON x.ticket_id = t.ticket_id</code>
Dans cette requête révisée, la sous-requête de la clause LEFT JOIN récupère les solutions combinées pour chaque ticket à l'aide de GROUP_CONCAT dans le regroupement approprié. La requête externe joint ensuite ce résultat à la table principale Tickets à l'aide du champ ticket_id.
Une approche alternative consiste à utiliser une requête imbriquée innerhalb der Haupt-SELECT-Anweisung :
<code class="sql">SELECT t.*, (SELECT GROUP_CONCAT(s.soution) FROM SOLUTIONS s WHERE s.ticket_id = t.ticket_id) AS combinedsolutions FROM TICKETS t</code>
Cette approche accomplit la même tâche en intégrant la requête GROUP_CONCAT dans l'instruction SELECT externe.
En utilisant l'une ou l'autre de ces modifications, la requête doit désormais récupérer correctement des lignes distinctes pour chaque ticket, chacune ligne contenant les informations sur le ticket et les solutions correspondantes pour ce ticket.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!