MySQL y GROUP_CONCAT () longitud máxima

260

Estoy usando GROUP_CONCAT()una consulta MySQL para convertir varias filas en una sola cadena. Sin embargo, la longitud máxima del resultado de esta función son 1024caracteres.

Soy muy consciente de que puedo cambiar el parámetro group_concat_max_lenpara aumentar este límite:

SET SESSION group_concat_max_len = 1000000;

Sin embargo, en el servidor que estoy usando, no puedo cambiar ningún parámetro. No utilizando la consulta anterior ni editando ningún archivo de configuración.

Entonces mi pregunta es: ¿hay alguna otra forma de obtener el resultado de una consulta de varias filas en una sola cadena?

ZeWaren
fuente
1
¿Te refieres a que no sea hacer el trabajo del lado del cliente?
lexu
40
Gracias amigo ... tu pregunta es la respuesta a mi pregunta :)
Mansoorkhan Cherupuzha
Parece que ya ha elegido una respuesta, pero por curiosidad, ¿por qué no puede usar la SETdeclaración para cambiar una variable de sesión?
Bill Karwin
2
Esto se debe a que la consulta que tuve que crear estaba incrustada en un marco php casero podrido, y no me permitieron editar ninguna otra parte. La forma en que se codificó este proyecto fue realmente vergonzosa.
ZeWaren
1
Me sorprendió que al usar la función group_concat mi cadena fuera un salto de retorno, no tenía idea de que esta función devuelve un número limitado de caracteres, gracias amigo, su pregunta me dejó claro :)
MasoodUrRehman

Respuestas:

335
SET SESSION group_concat_max_len = 1000000;

es una configuración temporal de ámbito de sesión. Solo se aplica a la sesión actual. Debe usarlo así.

SET SESSION group_concat_max_len = 1000000;
select group_concat(column) from table group by column

Puede hacerlo incluso compartiendo alojamiento, pero cuando usa otra sesión, debe repetir el SET SESSIONcomando.

keatkeat
fuente
44
SET GLOBAL group_concat_max_len=6999
Preferí
2
Rackspace y otros servidores en la nube no permiten el acceso GLOBAL. Intento usar jdbc.execute ("SET SESSION group_concat_max_len = ..."); dentro del método de inicialización de Dao, pero como ha dicho keatkeat, esto es solo temporal. Si alguien sabe la forma correcta de hacer este cambio de forma permanente, por favor hágamelo saber
IcedDante
61

El parámetro correcto para establecer la longitud máxima es:

SET @@group_concat_max_len = value_numeric;

value_numericdebe ser> 1024; por defecto el group_concat_max_lenvalor es 1024.

Oscar
fuente
3
SET SESSION y SET GLOBAL no funcionaron en un determinado servidor, ¡pero esto sí! ¡Gracias!
mfink
esto funcionó mientras que las otras sugerencias no funcionaron en MySQL Server 5.1.41 (sé que es una versión antigua)
low_rents
2
En realidad, puede establecer group_concat_max_lentan bajo como 4 . ( documentos de mysql ). " value_numericdebe ser> = 4" es el caso aquí. De hecho, usé esto para probar qué sucede cuando superas el group_concat_max_lenvalor.
Thomas F
1
Puedo confirmar que este parámetro NO es a prueba de reinicio: una vez que se reinicia mysql, la propiedad se restablece a 1024, así que -1 para mí
Frédéric
2
@NoWay debe establecer el valor en un archivo de configuración (por ejemplo, my.cnf) para que la configuración se aplique al reiniciar mysql. Ninguna SETconsulta afectará la configuración después de un reinicio.
Buttle Butkus
18

Incluya esta configuración en el archivo de configuración xampp my.ini:

[mysqld]
group_concat_max_len = 1000000

Luego reinicie xampp mysql

Chinnadurai Ramalingam
fuente
8

Puedes probar esto

SET GLOBAL group_concat_max_len = 1000000;
Mohamed El Mrabet
fuente
Estoy ejecutando este es el cliente sqlyog para mi base de datos, pero no está reflejando. Pero parece funcionar cuando lo ejecuto a través de mi programa Java
Jerry
5

La sintaxis correcta es mysql> SET @@global.group_concat_max_len = integer;
Si no tiene los privilegios para hacer esto en el servidor donde reside su base de datos, utilice una consulta como:
mySQL = "SET @@session.group_concat_max_len = 10000;"o un valor diferente.
Siguiente línea:
SET objRS = objConn.Execute(mySQL)  sus variables pueden ser diferentes.
entonces,
mySQL="SELECT GROUP_CONCAT(......);"etc.
Uso la última versión, ya que no tengo los privilegios para cambiar el valor predeterminado de 1024 a nivel mundial (usando cPanel).
Espero que esto ayude.

Ola Balstad
fuente
2
CREATE TABLE some_table (
  field1 int(11) NOT NULL AUTO_INCREMENT,
  field2 varchar(10) NOT NULL,
  field3 varchar(10) NOT NULL,
  PRIMARY KEY (`field1`)
);

INSERT INTO `some_table` (field1, field2, field3) VALUES
(1, 'text one', 'foo'),
(2, 'text two', 'bar'),
(3, 'text three', 'data'),
(4, 'text four', 'magic');

Esta consulta es un poco extraña, pero no necesita otra consulta para inicializar la variable; y se puede incrustar en una consulta más compleja. Devuelve todos los 'campos2 separados por punto y coma.

SELECT result
FROM   (SELECT @result := '',
               (SELECT result
                FROM   (SELECT @result := CONCAT_WS(';', @result, field2) AS result,
                               LENGTH(@result)                            AS blength
                        FROM   some_table
                        ORDER  BY blength DESC
                        LIMIT  1) AS sub1) AS result) AS sub2; 
ZeWaren
fuente
1
Esta es una gran respuesta, pero no termina la pregunta: es cómo obtener una concat muy larga, pero ¿qué pasa con la agrupación? Su consulta solo devuelve una fila, en lugar de una fila por grupo.
Benubird
Recuerdo que eso era lo que estaba tratando de hacer: obtener todo el conjunto de resultados en una sola cadena.
ZeWaren
9
@Benubird esta es una consulta muy mala. y por malo quiero decir terrible. el OP está haciendo una subconsulta correlacionada que tiene una subconsulta que está dentro de una subconsulta. si tuviera que examinar eso mediante comparaciones de datos, tendría 256 comparaciones en su conjunto de datos de muestra, también conocido como 4 filas ... ahora imagine que tiene 1k filas, eso es 1 billón de comparaciones.
John Ruddell
@ JohnRuddell Sí, lo es. Les puedo asegurar que esta consulta no está cerca de un sistema en vivo serio. En ese momento, lo necesitaba para algún tipo de desafío / ejercicio.
ZeWaren
55
Ah, te tengo ... Te recomendaría que tomes nota de eso para otros transeúntes ... Como esta respuesta será engañosa :) Sin embargo, intento interesante
John Ruddell