Inne odpowiedzi na to pytanie nie zwracają tego, czego potrzebuje OP, zwracają ciąg znaków:
test1 test2 test3 test1 test3 test4
(zauważ, że test1
i test3
są powielone), podczas gdy OP chce zwrócić ten ciąg:
test1 test2 test3 test4
Problem polega na tym, że ciąg "test1 test3"
jest duplikowany i wstawiany tylko raz, ale wszystkie pozostałe są od siebie różne ( "test1 test2 test3"
różni się "test1 test3"
, nawet jeśli niektóre testy zawarte w całym ciągu są powielone).
Musimy tutaj podzielić każdy ciąg na różne wiersze, a najpierw musimy utworzyć tabelę liczb:
CREATE TABLE numbers (n INT);
INSERT INTO numbers VALUES
(1),(2),(3),(4),(5),(6),(7),(8),(9),(10);
możemy uruchomić to zapytanie:
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;
i otrzymujemy taki wynik:
test1
test4
test1
test1
test2
test3
test3
test3
a następnie możemy zastosować funkcję agregującą GROUP_CONCAT, używając klauzuli DISTINCT:
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;
Zobacz skrzypce tutaj .
Zwróci to różne wartości, takie jak: test1, test2, test4, test3
źródło
Możesz po prostu dodać DISTINCT z przodu.
jeśli chcesz sortować,
źródło