Otras respuestas a esta pregunta no devuelven lo que el OP necesita, devolverán una cadena como:
test1 test2 test3 test1 test3 test4
(observe eso test1
y test3
están duplicados) mientras el OP quiere devolver esta cadena:
test1 test2 test3 test4
El problema aquí es que la cadena "test1 test3"
se duplica y se inserta solo una vez, pero todos los demás son distintos entre sí ( "test1 test2 test3"
es distinto de"test1 test3"
, incluso si algunas pruebas contenidas en la cadena completa están duplicadas).
Lo que tenemos que hacer aquí es dividir cada cadena en diferentes filas, y primero debemos crear una tabla de números:
CREATE TABLE numbers (n INT);
INSERT INTO numbers VALUES
(1),(2),(3),(4),(5),(6),(7),(8),(9),(10);
entonces podemos ejecutar 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;
y obtenemos un resultado como este:
test1
test4
test1
test1
test2
test3
test3
test3
y luego podemos aplicar la función agregada GROUP_CONCAT, usando la 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, vea el violín aquí .
Esto devolverá valores distintos como: test1, test2, test4, test3
fuente
Simplemente puede agregar DISTINCT al frente.
si quieres ordenar,
fuente