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