Outras respostas a esta pergunta não retornam o que o OP precisa, elas retornarão uma string como:
test1 test2 test3 test1 test3 test4
(observe que test1
e test3
são duplicados) enquanto o OP deseja retornar essa sequência:
test1 test2 test3 test4
o problema aqui é que a cadeia de caracteres "test1 test3"
é duplicada e inserida apenas uma vez, mas todas as outras são distintas uma da outra ( "test1 test2 test3"
é diferente de"test1 test3"
, mesmo que alguns testes contidos na cadeia inteira sejam duplicados).
O que precisamos fazer aqui é dividir cada sequência em linhas diferentes, e primeiro precisamos criar uma tabela de números:
CREATE TABLE numbers (n INT);
INSERT INTO numbers VALUES
(1),(2),(3),(4),(5),(6),(7),(8),(9),(10);
então podemos executar esta consulta:
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;
e obtemos um resultado como este:
test1
test4
test1
test1
test2
test3
test3
test3
e então podemos aplicar a função agregada GROUP_CONCAT, usando a cláusula 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;
Por favor, veja violino aqui .