Maison >base de données >tutoriel mysql >Pourquoi mes LEFT JOIN et GROUP_CONCAT produisent-ils des résultats en double ?

Pourquoi mes LEFT JOIN et GROUP_CONCAT produisent-ils des résultats en double ?

Susan Sarandon
Susan Sarandonoriginal
2025-01-18 06:13:11285parcourir

Why Are My LEFT JOINs and GROUP_CONCAT Producing Duplicate Results?

Dépannage des données en double provenant de LEFT JOIN et GROUP_CONCAT

Votre requête, qui utilise LEFT JOINs, GROUP BY et GROUP_CONCAT pour rassembler les principales balises et catégories pour chaque utilisateur, produit de manière inattendue des entrées en double.

Comprendre le problème de la duplication

Le problème vient du multiple LEFT JOINs créant une relation plusieurs-à-plusieurs entre les utilisateurs, les balises et les catégories. Il en résulte plusieurs lignes pour chaque utilisateur, chacune représentant une combinaison balise-catégorie différente. Le GROUP BY les regroupe ensuite, conduisant aux éléments dupliqués dans GROUP_CONCAT.

Solution : Utiliser DISTINCT avec GROUP_CONCAT

Pour éliminer les doublons, ajoutez le mot-clé DISTINCT dans vos fonctions GROUP_CONCAT. Cela garantit que seules les balises et catégories uniques sont concaténées :

<code class="language-sql">SELECT
    q1.user_id, q1.user_name, q1.score, q1.reputation, 
    SUBSTRING_INDEX(GROUP_CONCAT(DISTINCT q2.tag ORDER BY q2.tag_reputation DESC SEPARATOR ','), ',', 2) AS top_two_tags,
    SUBSTRING_INDEX(GROUP_CONCAT(DISTINCT q3.category ORDER BY q3.category_reputation DESC SEPARATOR ','), ',', 2) AS category
FROM
    ...</code>

Alternative : sous-requêtes pour une agrégation plus propre

Une stratégie alternative évite complètement la combinaison LEFT JOIN et GROUP BY. L'utilisation de sous-requêtes (ou CTE pour des scénarios plus complexes) permet une agrégation plus contrôlée :

<code class="language-sql">SELECT
    u.user_id, u.user_name, u.score, u.reputation, 
    (SELECT GROUP_CONCAT(tag ORDER BY tag_reputation DESC SEPARATOR ',') 
     FROM post_tag WHERE user_id = u.user_id LIMIT 2) AS top_two_tags,
    (SELECT GROUP_CONCAT(category ORDER BY category_reputation DESC SEPARATOR ',') 
     FROM post_category WHERE category_id = u.category_id LIMIT 2) AS category
FROM
    users u</code>

Cette méthode garantit que l'agrégation se produit indépendamment pour chaque utilisateur, évitant ainsi la duplication antérieure. Choisissez l'approche qui convient le mieux à la structure de votre base de données et à la complexité des requêtes.

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