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!