MySQL DISTINCT auf einem GROUP_CONCAT ()


183

Ich mache SELECT GROUP_CONCAT(categories SEPARATOR ' ') FROM table. Beispieldaten unten:

categories
----------
test1 test2 test3
test4
test1 test3
test1 test3

Ich test1 test2 test3 test4 test1 test3komme test1 test2 test3 test4jedoch zurück und würde gerne zurückkommen. Irgendwelche Ideen?

Danke vielmals!

Antworten:


361

GROUP_CONCAT hat das Attribut DISTINCT:

SELECT GROUP_CONCAT(DISTINCT categories ORDER BY categories ASC SEPARATOR ' ') FROM table

48

Die Verwendung von DISTINCT funktioniert

SELECT GROUP_CONCAT(DISTINCT(categories) SEPARATOR ' ') FROM table

REf: - das


19

DISTINCT: will gibt Ihnen eindeutige Werte.

SELECT GROUP_CONCAT(DISTINCT(categories )) AS categories FROM table

17

Andere Antworten auf diese Frage geben nicht zurück, was das OP benötigt, sondern geben eine Zeichenfolge zurück wie:

test1 test2 test3 test1 test3 test4

(Beachten Sie, dass test1und test3dupliziert werden), während das OP diese Zeichenfolge zurückgeben möchte:

test1 test2 test3 test4

Das Problem hierbei ist, dass die Zeichenfolge "test1 test3"dupliziert und nur einmal eingefügt wird, aber alle anderen voneinander verschieden sind ( "test1 test2 test3"unterscheidet sich von "test1 test3", selbst wenn einige in der gesamten Zeichenfolge enthaltene Tests dupliziert werden).

Was wir hier tun müssen, ist, jede Zeichenfolge in verschiedene Zeilen aufzuteilen, und wir müssen zuerst eine Zahlentabelle erstellen:

CREATE TABLE numbers (n INT);
INSERT INTO numbers VALUES
(1),(2),(3),(4),(5),(6),(7),(8),(9),(10);

dann können wir diese Abfrage ausführen:

SELECT
  SUBSTRING_INDEX(
    SUBSTRING_INDEX(tableName.categories, ' ', numbers.n),
    ' ',
    -1) category
FROM
  numbers INNER JOIN tableName
  ON
    LENGTH(tableName.categories)>=
    LENGTH(REPLACE(tableName.categories, ' ', ''))+numbers.n-1;

und wir erhalten ein Ergebnis wie dieses:

test1
test4
test1
test1
test2
test3
test3
test3

und dann können wir die Aggregatfunktion GROUP_CONCAT unter Verwendung der DISTINCT-Klausel anwenden:

SELECT
  GROUP_CONCAT(DISTINCT category ORDER BY category SEPARATOR ' ')
FROM (
  SELECT
    SUBSTRING_INDEX(SUBSTRING_INDEX(tableName.categories, ' ', numbers.n), ' ', -1) category
  FROM
    numbers INNER JOIN tableName
    ON LENGTH(tableName.categories)>=LENGTH(REPLACE(tableName.categories, ' ', ''))+numbers.n-1
  ) s;

Bitte sehen Sie Geige hier .


Es scheint, dass Ihre Interpretation der Frage von OP richtig ist. Ich denke jedoch, dass darauf hingewiesen werden sollte, dass die Normalisierung der Daten durch Erstellen einer "blah_to_categories" - und einer "Kategorien" -Tabelle für die entsprechende Viele-zu-Viele-Beziehung hier die beste Vorgehensweise wäre und viel Flexibilität hinzufügen würde. Ihre Antwort ist jedoch eine clevere Problemumgehung für alle, die ein solches denormalisiertes Schema erben. Es könnte wahrscheinlich auch angepasst werden, um eine Migration vom alten zum normalisierten Schema zu generieren.
XP84

11
SELECT
  GROUP_CONCAT(DISTINCT (category))
FROM (
  SELECT
    SUBSTRING_INDEX(SUBSTRING_INDEX(tableName.categories, ' ', numbers.n), ' ', -1) category
  FROM
    numbers INNER JOIN tableName
    ON LENGTH(tableName.categories)>=LENGTH(REPLACE(tableName.categories, ' ', ''))+numbers.n-1
  ) s;   

Dies gibt unterschiedliche Werte zurück wie: test1, test2, test4, test3


5

Sie können einfach DISTINCT vorne hinzufügen .

SELECT GROUP_CONCAT(DISTINCT categories SEPARATOR ' ')

wenn Sie sortieren möchten,

SELECT GROUP_CONCAT(DISTINCT categories ORDER BY categories ASC SEPARATOR ' ')
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.