MySQL GROUP_CONCAT con COLUMN SPLIT

Estoy trabajando con una TABLA, necesito ayuda lógica.

Consulte la URL siguiente para ver la estructura de la tabla y los datos de muestra.

http://sqlfiddle.com/#!2/ece06/2

Esquema de tabla:

CREATE TABLE test ( ID INTEGER, NAME VARCHAR (50), VALUE INTEGER ); 

Datos insertados:

 INSERT INTO test VALUES (1, 'A', 4); INSERT INTO test VALUES (1, 'B', 5); INSERT INTO test VALUES (1, 'C', 8); INSERT INTO test VALUES (2, 'D', 9); INSERT INTO test VALUES (2, 'E', 9); INSERT INTO test VALUES (3, 'F', 9); INSERT INTO test VALUES (3, 'G', 9); INSERT INTO test VALUES (3, 'H', 9); INSERT INTO test VALUES (3, 'I', 9); 

Consulta:

 SELECT ID, GROUP_CONCAT(NAME) AS CODE FROM test GROUP BY ID; 

Salida:

 ID CODE 1 A,B,C 2 D,E 3 F,G,H,I 

Rendimiento esperado:

 ID CODE CODE CODE CODE 1 ABC NULL 2 DE NULL NULL 3 FGHI 

Como puede ver, el resultado de la consulta tiene concat con coma. ¡Y actualmente estamos haciendo string concat usando PHP que se divide mientras se muestra!

¿Hay alguna otra forma de dividir el RESULTADO y mostrar cada valor en columna y el mismo FILA? En el mismo resultado?

Nota: El CÓDIGO puede variar para cada FILA.

Si conoce el número de inputs GROUP_CONCAT (es decir, 3 campos se combinan en el caso de ID = 1 y 2 campos se combinan en el caso de 2, etc.), entonces hay una manera sucia.

 SELECT ID, SUBSTRING_INDEX(SUBSTRING_INDEX(GROUP_CONCAT(NAME), ',', 1), ',', -1) AS CODE1, If( length(GROUP_CONCAT(NAME)) - length(replace(GROUP_CONCAT(NAME), ',', ''))>1, SUBSTRING_INDEX(SUBSTRING_INDEX(GROUP_CONCAT(NAME), ',', 2), ',', -1) ,NULL) as CODE2, SUBSTRING_INDEX(SUBSTRING_INDEX(GROUP_CONCAT(NAME), ',', 3), ',', -1) AS CODE3 FROM test GROUP BY ID; 

Salida:

 ID CODE1 CODE2 CODE3 1 ABC 2 D (null) E 3 FGH 

La consulta anterior asume que usted es un GRUPO_CONCAT-ing 3 campos. Si está generando dinámicamente consultas, puede intentarlo. SQLFIDDLE

EDITAR: Nota: El CÓDIGO puede variar para cada FILA. (Ignorando esto)

Con la ayuda de mi colega Llegamos a un punto para resolver este senario. Espero que alguien lo necesite … Es bienvenido si alguien lo hace mucho más simple.

 BEGIN SET @v=0; SET @v1=0; SELECT tmp.cnt INTO @v FROM (SELECT Id, count(ID) AS cnt, GROUP_CONCAT(name) FROM test GROUP BY id) tmp ORDER BY tmp.cnt DESC LIMIT 1; SET @str=' '; WHILE(@v>@v1) DO SET @v1=@v1+1; IF(@str='') THEN SET @str=CONCAT(@str,'ID, REPLACE(SUBSTRING(SUBSTRING_INDEX(GROUP_CONCAT(NAME), '','',', @v1,'),LENGTH(SUBSTRING_INDEX(GROUP_CONCAT(NAME),'','',', @v1,'-1)) + 1),'','','''') AS Code' ,@v1); ELSE SET @str= CONCAT(@str,',REPLACE(SUBSTRING(SUBSTRING_INDEX(GROUP_CONCAT(NAME),'','',', @v1,'),LENGTH(SUBSTRING_INDEX(GROUP_CONCAT(NAME),'','',' , @v1,' -1)) + 1),'','','''') AS Code',@v1); END IF; END WHILE; SET @str=CONCAT('SELECT ' , @str, ' FROM test GROUP BY ID'); PREPARE MYSQLQUERY FROM @str; EXECUTE MYSQLQUERY; DEALLOCATE PREPARE MYSQLQUERY; END 

La única manera de dividir eso en columnas significará que conoce los valores que desea dividir por adelantado (por ejemplo, una columna para códigos que coincidan con A, D, F otra para B, E, G etc.). Esto no parece ser el caso.

El enfoque a testing de balas no sería agrupar y procesar los resultados en PHP.

La otra forma posible (no la que yo recomendaría) sería cambiar el saparator de una coma a otra cosa. P.EJ:

 SELECT ID, GROUP_CONCAT(NAME SEPARATOR ';') AS CODE FROM test GROUP BY ID 
    Intereting Posts