¿Cómo hackear MySQL GROUP_CONCAT para recuperar un número limitado de filas?

De alguna manera necesito esta característica, pero MySQL no la admite en este momento.

Estoy usando GROUP_CONCAT(CONCAT(...)) para generar cosas similares a xml.

¡Pero cuando el tamaño excede el límite, el xml simplemente se rompe!

¡De modo que tengo que hacer que solo recupere 5 filas!

He SUBSTRING_INDEX esto usando SUBSTRING_INDEX .

Por ejemplo:

 SELECT SUBSTRING_INDEX(GROUP_CONCAT(Field1 SEPARATOR ','), ',', [# of elements to return]) FROM Table1; 

Un ejemplo para la respuesta de Charles:

BASIC:

 SELECT GROUP_CONCAT( field ) FROM ( SELECT field FROM table LIMIT 200 ) 

extendido:

CAST puede ser útil si el búffer trunca el resultado:

 SELECT CAST( GROUP_CONCAT( field ) AS CHAR(2048) ) FROM ( SELECT field FROM table LIMIT 200 ) 

No es realmente una respuesta a su pregunta, sino una referencia para otras personas que también deseen utilizar una cláusula LIMIT en GROUP_CONCAT ():

Una solicitud de función fue presentada hace mucho tiempo a los desarrolladores de MySql. Aun no implementado 🙁

Use una tabla / subconsulta temporal para limitar los resultados? Sin ver su consulta, será difícil dar un consejo sólido para esa ruta.

Sin embargo, es posible que la configuración group_concat_max_len sea ​​más útil. Controla la longitud máxima de una operación GROUP_CONCAT , en longitud de cadena. Suba para evitar GROUP_CONCAT roto, cuando no puede permitirse limitar los resultados.

Para aquellos casos donde no puede usar una tabla temporal, lo mejor que sé es seleccionar un separador oscuro y luego truncar comenzando en la primera instancia de dicho carácter. Este ejemplo usa el carácter NUL.

select substring_index(group_concat(field separator '\0'), '\0', 5) from table;

Donde field es el nombre del campo, 5 es la cantidad de resultados.

El inconveniente es que si la primera fila contiene ese carácter, será un resultado parcial.

Una solución alternativa sería reemplazar '\0' con una cadena aleatoria más larga.

Es bueno saber que el field podría reemplazarse para incluir más información usando concat .

Tenga en cuenta que group_concat_max_len un group_concat_max_len predeterminado de 1024 caracteres, por lo que debe considerar cambiarlo globalmente o dentro de su aplicación si desea más que eso.

Puede simular el row_number particionado utilizando variables de usuario y luego limitar las filas y aplicar group_concat:

Considera la siguiente tabla:

 create table your_table ( id int primary key autoincrement, category int, value int ); 

y datos:

 insert into your_table (category, value) values (1, 1), (1, 2), (1, 3), (1, 4), (1, 5), (2, 6), (2, 7), (2, 8), (2, 9), (2, 10), (3, 11), (3, 12), (3, 13), (3, 14), (3, 15); 

Y queremos que el valor de top 3 (en el orden de la última id) por categoría sea concatenado:

 select category, group_concat(value order by id desc) as value_con from ( select t.*, @rn := if(@category = category, @rn + 1, if(@category := category,1, 1)) as seqnum from your_table t cross join (select @category := null, @rn := 0) x order by t.category, t.id desc ) t where seqnum <= 3 group by category; 

Salida:

 category value_con 1 5,4,3 2 10,9,8 3 15,14,13 

Aquí hay una demostración de esto.