Fehlerbehebung bei doppelten Daten aus LEFT JOINs und GROUP_CONCAT
Ihre Abfrage, die LEFT JOINs
, GROUP BY
und GROUP_CONCAT
verwendet, um Top-Tags und Kategorien für jeden Benutzer zu sammeln, führt unerwartet zu doppelten Einträgen.
Das Problem der Duplizierung verstehen
Das Problem ergibt sich aus der mehrfachen LEFT JOINs
Erstellung einer Viele-zu-Viele-Beziehung zwischen Benutzern, Tags und Kategorien. Dies führt zu mehreren Zeilen für jeden Benutzer, die jeweils eine andere Tag-Kategorie-Kombination darstellen. Das GROUP BY
fasst diese dann zusammen, was zu den duplizierten Elementen innerhalb von GROUP_CONCAT
.
Lösung: Verwendung von DISTINCT mit GROUP_CONCAT
Um Duplikate zu entfernen, fügen Sie das Schlüsselwort DISTINCT
in Ihre GROUP_CONCAT
-Funktionen ein. Dadurch wird sichergestellt, dass nur eindeutige Tags und Kategorien verkettet werden:
<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: Unterabfragen für sauberere Aggregation
Eine alternative Strategie vermeidet die Kombination LEFT JOIN
und GROUP BY
insgesamt. Der Einsatz von Unterabfragen (oder CTEs für komplexere Szenarien) sorgt für eine kontrolliertere Aggregation:
<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>
Diese Methode stellt sicher, dass die Aggregation für jeden Benutzer unabhängig erfolgt und verhindert so eine frühere Duplizierung. Wählen Sie den Ansatz, der am besten zu Ihrer Datenbankstruktur und Abfragekomplexität passt.
Das obige ist der detaillierte Inhalt vonWarum erzeugen meine LEFT JOINs und GROUP_CONCAT doppelte Ergebnisse?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!