Dépannage des valeurs en double dans GROUP_CONCAT après plusieurs LEFT JOIN sur des requêtes groupées
L'utilisation de GROUP_CONCAT
avec plusieurs LEFT JOIN
sur des requêtes groupées peut entraîner des valeurs en double. Cela se produit souvent lorsqu'un troisième LEFT JOIN
introduit plusieurs lignes pour chaque combinaison (balise, catégorie) liée à un identifiant utilisateur. Le GROUP BY
suivant produit ensuite des paires en double (ID utilisateur, balise) et (ID utilisateur, catégorie) dans les résultats GROUP_CONCAT
.
Plusieurs stratégies peuvent remédier à cette duplication :
Employer DISTINCT
dans GROUP_CONCAT
: L'ajout de DISTINCT
à l'intérieur de la fonction GROUP_CONCAT
supprime directement les valeurs en double dans chaque liste concaténée.
Approche LEFT JOIN
séquentielle : Effectuez les LEFT JOIN
séquentiellement. Tout d'abord, joignez la table user avec la table tags, regroupez les résultats, puis LEFT JOIN
ce résultat intermédiaire avec la table catégories, en regroupant à nouveau. Cela garantit que chaque ID utilisateur comporte une seule ligne avec des combinaisons de balises et de catégories distinctes.
Exploiter les sous-requêtes scalaires : Utilisez des sous-requêtes scalaires dans la clause SELECT
pour calculer les valeurs GROUP_CONCAT
indépendamment pour chaque ID utilisateur, garantissant une seule ligne par utilisateur.
Utiliser des INNER JOIN
symétriques : Au lieu de LEFT JOIN
, employez des INNER JOIN
. Rejoignez la table utilisateur avec la table des balises, puis effectuez un autre INNER JOIN
basé sur l'ID utilisateur. Répétez ce processus pour la table des utilisateurs et la table des catégories.
La solution optimale dépend de la structure des données et des performances des requêtes. L'analyse des plans de requête et des temps d'exécution est cruciale pour sélectionner la méthode la plus efficace.
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!