Maison >base de données >tutoriel mysql >Pourquoi mes résultats GROUP_CONCAT sont-ils dupliqués après l'ajout de LEFT JOIN ?

Pourquoi mes résultats GROUP_CONCAT sont-ils dupliqués après l'ajout de LEFT JOIN ?

Susan Sarandon
Susan Sarandonoriginal
2025-01-18 06:01:13647parcourir

Why are My GROUP_CONCAT Results Duplicated After Adding LEFT JOINs?

GROUP_CONCAT produit des valeurs en double : problèmes après l'ajout de LEFT JOIN

Question :

Un utilisateur a des valeurs en double dans ses résultats GROUP_CONCAT après avoir ajouté une catégorie LEFT JOIN à une requête existante qui récupère les données utilisateur, les balises et la réputation.

Description du problème :

La requête d'origine récupère correctement les deux premières balises associées à chaque utilisateur. Cependant, après avoir ajouté la catégorie LEFT JOIN, il existe des doublons dans les résultats pour les étiquettes et les catégories. Le résultat attendu est que les deux premières catégories doivent être uniques pour chaque utilisateur.

Solution :

Le problème se produit parce que LEFT JOIN provoque la jointure de chaque user_id avec plusieurs combinaisons de balises et de catégories, ce qui entraîne des lignes en double après GROUP BY. Afin de résoudre ce problème, plusieurs méthodes peuvent être utilisées :

Méthode LEFT JOIN cumulative :

  • Effectuez un LEFT JOIN entre la requête d'origine et la table de balises.
  • Regroupez par les résultats et effectuez GROUP_CONCAT.
  • Effectuez un LEFT JOIN entre les résultats cumulés et le tableau des catégories.
  • Regroupez par la colonne de catégorie et effectuez GROUP_CONCAT.

Méthode de jointure interne symétrique :

  • Effectuez un LEFT JOIN entre la requête d'origine et la table de balises.
  • Regroupez par les résultats et effectuez GROUP_CONCAT.
  • Effectuez un LEFT JOIN séparément entre la requête d'origine et la table des catégories.
  • Regroupez par les résultats et effectuez GROUP_CONCAT.
  • Inner Joignez les deux résultats en fonction de user_id.

Méthode de sous-requête scalaire :

  • Extraire les résultats GROUP_CONCAT pour les étiquettes et les catégories séparément à l'aide de sous-requêtes scalaires, chacune contenant un GROUP BY.

Méthode LEFT JOIN modifiée à l'aide de DISTINCT GROUP_CONCAT :

  • Effectuez un LEFT JOIN entre la requête d'origine et la table de balises.
  • Regroupez par le résultat et effectuez GROUP_CONCAT en utilisant DISTINCT.
  • Effectuez un LEFT JOIN entre les tableaux de résultats et de catégories.
  • Regroupez par la colonne de catégorie et effectuez GROUP_CONCAT en utilisant DISTINCT.

Le choix de l'approche peut dépendre de compromis techniques, notamment l'efficacité du plan de requête, les niveaux de duplication des données et le timing.

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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn