webentwicklung-frage-antwort-db.com.de

MySQL DISTINCT auf einem GROUP_CONCAT ()

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

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

Ich erhalte jedoch test1 test2 test3 test4 test1 test3 Zurück und möchte test1 test2 test3 test4 Zurückerhalten. Irgendwelche Ideen?

Danke vielmals!

162
user371990

GROUP_CONCAT hat das Attribut DISTINCT:

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

Die Verwendung von DISTINCT funktioniert

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

REf: - this

45
Salil

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

test1 test2 test3 test1 test3 test4

(beachte das test1 und test3 werden dupliziert), während das OP diesen String zurückgeben möchte:

test1 test2 test3 test4

das Problem hier ist, dass die Zeichenfolge "test1 test3" wird dupliziert und nur einmal eingefügt, aber alle anderen unterscheiden sich voneinander ("test1 test2 test3" ist anders als "test1 test3", auch wenn einige in der gesamten Zeichenfolge enthaltene Tests dupliziert wurden).

Was wir hier tun müssen, ist, jede Zeichenkette in verschiedene Zeilen aufzuteilen und zuerst eine Zahlentabelle zu 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 folgt:

test1
test4
test1
test1
test2
test3
test3
test3

anschließend können wir die GROUP_CONCAT-Aggregatfunktion mit 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 siehe Geige hier .

16
fthiella
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 eindeutige Werte zurück wie: test1, test2, test4, test

11
Sainath

DISTINCT: gibt Ihnen eindeutige Werte.

SELECT GROUP_CONCAT(DISTINCT(categories )) AS categories FROM table
7
Goshika Mahesh

Sie können einfach vor DISTINCT hinzufügen.

SELECT GROUP_CONCAT(DISTINCT categories SEPARATOR ' ')

wenn du sortieren willst,

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

Mir ist klar, dass diese Frage alt ist, aber ich denke, dass dies erwähnt werden sollte: group_concat mit distinct = performance killer. Wenn Sie in kleinen Datenbanken arbeiten, werden Sie es nicht bemerken, aber wenn es skaliert - wird es nicht sehr gut funktionieren.

1
photocode