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!
GROUP_CONCAT hat das Attribut DISTINCT:
SELECT GROUP_CONCAT(DISTINCT categories ORDER BY categories ASC SEPARATOR ' ') FROM table
Die Verwendung von DISTINCT funktioniert
SELECT GROUP_CONCAT(DISTINCT(categories) SEPARATOR ' ') FROM table
REf: - this
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 .
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
DISTINCT
: gibt Ihnen eindeutige Werte.
SELECT GROUP_CONCAT(DISTINCT(categories )) AS categories FROM table
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.