MySQL DISTINCT en un GROUP_CONCAT ()

Estoy haciendo SELECT GROUP_CONCAT(categories SEPARATOR ' ') FROM table . Muestra de datos a continuación:

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

Sin embargo, recibo test1 test2 test3 test4 test1 test3 y me gustaría volver a test1 test2 test3 test4 . ¿Algunas ideas?

¡Muchas gracias!

GROUP_CONCAT tiene el atributo DISTINCT:

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

Usar DISTINCT funcionará

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

REf: – esto

Otras respuestas a esta pregunta no devuelven lo que el OP necesita, devolverán una cadena como:

 test1 test2 test3 test1 test3 test4 

(observe que test1 y test3 están duplicados) mientras que OP quiere devolver esta cadena:

 test1 test2 test3 test4 

el problema aquí es que la cadena "test1 test3" está duplicada y se inserta solo una vez, pero todas las demás son distintas entre sí ( "test1 test2 test3" es distinto de "test1 test3" , incluso si algunas pruebas contenidas en el toda la cadena está duplicada).

Lo que tenemos que hacer aquí es dividir cada cadena en filas diferentes, y primero tenemos que 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, mira el violín aquí .

 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; 

Esto devolverá valores distintos como: test1, test2, test4, test3

Me doy cuenta de que esta pregunta es antigua, pero siento que esto debería mencionarse: group_concat con distinct = performance killer. Si trabajas en bases de datos pequeñas, no lo notarás, pero cuando se escala, no funcionará muy bien.