group_concat ejemplos mysql group-concat

ejemplos - MySQL DISTINCT en un GROUP_CONCAT()



mysql group_concat order (5)

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.

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!


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 here .


Usar DISTINCT funcionará

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

REf: - this


GROUP_CONCAT tiene el atributo DISTINCT:

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


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