Heim >Datenbank >MySQL-Tutorial >Wie vermeide ich Duplikate in „GROUP_CONCAT' beim Zusammenführen mehrerer „GROUP_BY'?
Umgang mit doppelten Ergebnissen in GROUP_CONCAT
mit mehreren GROUP BY
Verknüpfungen
Das Kombinieren mehrerer GROUP BY
-Klauseln über LEFT JOIN
s 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 BY
s.
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!