2010-04-02 24 views
187

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

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

SET SESSION group_concat_max_len = 1000000; 

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

Así que mi pregunta es: ¿Hay alguna otra manera de obtener el resultado de una consulta de múltiples filas en una sola cadena?

+1

Te refieres aparte de hacer el trabajo del lado del cliente? – lexu

+24

Gracias amigo ...su pregunta es la respuesta a mi pregunta :) –

+0

Parece que ya ha elegido una respuesta, pero por curiosidad, ¿por qué no puede usar la instrucción 'SET' para cambiar una variable de sesión? –

Respuesta

3
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 puede ser incrustado 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; 
+1

Esta es una gran respuesta, pero no termina el pregunta - esta es la forma de obtener una larga concat, pero ¿qué pasa con la agrupación? Su consulta solo devuelve una fila, en lugar de una fila por grupo. – Benubird

+0

Recuerdo que eso es lo que estaba tratando de hacer: obtener el conjunto completo de resultados en una sola cadena. – ZeWaren

+8

@Benubird esta es una muy mala consulta. y por malo quiero decir terrible. el OP está haciendo una subconsulta correlacionada que tiene una subconsulta 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 imagínese si tiene 1k filas, es decir 1 billón de comparaciones. –

262
SET SESSION group_concat_max_len = 1000000; 

es una sesión de alcance, el ajuste temporal. 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 

Usted puede hacer esto incluso en el intercambio de alojamiento, pero cuando se utiliza una sesión de otra, es necesario repetir el comando SET SESSION.

+3

Preferí usar GLOBAL en lugar de SESSION: 'SET GLOBAL group_concat_max_len = 6999' para hacer que la configuración sea válida en las consultas – IcedDante

+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 Dao initialize, pero como ha declarado keatkeat, esto es solo temporal. Si alguien sabe la manera correcta de hacer este cambio de forma permanente, por favor hágamelo saber – IcedDante

+0

¡¡¡Trabajo increíble !!!!!!!!!!! ¡¡Muchas gracias ... ¡funcionó como un encanto! –

35

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

SET @@group_concat_max_len = value_numeric; 

value_numeric debe ser> 1024; Por defecto, el valor es group_concat_max_len 1024.

+2

SET SESSION y SET GLOBAL no funcionó en un determinado servidor, ¡pero esto sí! ¡Gracias! – mfink

+0

esto funcionó mientras que las otras sugerencias no lo hicieron @ ** MySQL Server 5.1.41 ** (Sé que es una versión anterior) –

+1

Puede establecer 'group_concat_max_len' en un valor tan bajo como ** 4 **. ([documentos de mysql] (http://dev.mysql.com/doc/refman/5.7/en/server-system-variables.html#sysvar_group_concat_max_len)). "' value_numeric' debe ser> = 4 "es el caso aquí. De hecho, lo usé para probar lo que sucede cuando se supera el valor 'group_concat_max_len'. –

2

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

+0

Algo que no aprobaste aquí Ataur Rahman Munna? –

0

Puede probar este

SET GLOBAL group_concat_max_len = 1000000; 
2

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

[mysqld] group_concat_max_len = 1000000

A continuación, reinicie xampp MySQL