Heim >Datenbank >MySQL-Tutorial >Wie vermeide ich Duplikate in „GROUP_CONCAT' beim Zusammenführen mehrerer „GROUP_BY'?

Wie vermeide ich Duplikate in „GROUP_CONCAT' beim Zusammenführen mehrerer „GROUP_BY'?

Linda Hamilton
Linda HamiltonOriginal
2025-01-18 06:16:09312Durchsuche

How to Avoid Duplicates in `GROUP_CONCAT` When Joining Multiple `GROUP_BY`s?

Umgang mit doppelten Ergebnissen in GROUP_CONCAT mit mehreren GROUP BY Verknüpfungen

Das Kombinieren mehrerer GROUP BY-Klauseln über LEFT JOINs und die Verwendung von GROUP_CONCAT kann zu doppelten Einträgen führen. Dies entsteht durch die Zusammenführung eindeutiger Schlüssel von jedem GROUP BY, was zu einer ungenauen Datendarstellung führt.

Problemszenario

Bedenken Sie diese Abfragestruktur:

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

Diese Abfrage zielt darauf ab, die beiden obersten Tags und Kategorien für jeden Benutzer abzurufen, wobei Tabellen für Benutzer, Tags, Reputationen, post_tag, Kategorien und post_category angenommen werden. Das Problem ist die Möglichkeit von Duplikaten wie „css,css“ oder „technology,technology“ aufgrund der verbundenen GROUP BYs.

Effektive Lösungen

Mehrere Methoden können diese Duplikate verhindern:

1. Trennen Sie GROUP BY und INNER JOIN:

<code class="language-sql">-- Separate grouping and joining approach
SELECT
    q1.user_id, q1.user_name, q1.score, q1.reputation, q1.top_two_tags, q2.category
FROM
    (SELECT
        q1.user_id, q1.user_name, q1.score, q1.reputation, 
        SUBSTRING_INDEX(GROUP_CONCAT(q2.tag ORDER BY q2.tag_reputation DESC SEPARATOR ','), ',', 2) AS top_two_tags
    FROM
        (...) AS q1
        LEFT JOIN (...) AS q2 ON q2.user_id = q1.user_id 
    GROUP BY
        q1.user_id, q1.user_name, q1.score, q1.reputation
    ) AS q1
    INNER JOIN
    (SELECT
        q1.user_id, 
        SUBSTRING_INDEX(GROUP_CONCAT(q3.category ORDER BY q3.category_reputation DESC SEPARATOR ','), ',', 2) AS category
    FROM
        (...) AS q1
        LEFT JOIN (...) AS q3 ON q3.user_id = q1.user_id 
    GROUP BY
        q1.user_id
    ) AS q2
    ON q1.user_id = q2.user_id;</code>

Diese Methode gruppiert und verkettet zunächst Tags und Kategorien separat und verbindet dann die Ergebnisse mithilfe eines INNER JOIN auf user_id. Dadurch wird sichergestellt, dass nur eine Zeile pro Benutzer erstellt wird.

2. Skalare Unterabfragen:

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

Hierbei werden Unterabfragen innerhalb der SELECT-Liste verwendet, um die wichtigsten Tags und Kategorien für jeden Benutzer einzeln abzurufen und so die GROUP BY-Mehrdeutigkeit zu vermeiden.

Der Schlüssel besteht darin, die direkte Verkettung von Daten aus mehreren verknüpften Tabellen innerhalb eines einzigen GROUP_CONCAT-Aufrufs zu vermeiden, wenn GROUP BY für mehrere Tabellen verwendet wird. Die gewählte Lösung hängt von der spezifischen Datenbankstruktur und Leistungsaspekten ab. Das Ziel besteht darin, genaue, duplikatfreie Ergebnisse zu erzielen.

Das obige ist der detaillierte Inhalt vonWie vermeide ich Duplikate in „GROUP_CONCAT' beim Zusammenführen mehrerer „GROUP_BY'?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn