2010-04-02 10 views
187

Я использую GROUP_CONCAT() в запросе MySQL для преобразования нескольких строк в одну строку. Однако максимальная длина результата этой функции составляет 1024 символов.MySQL и GROUP_CONCAT() максимальная длина

Я очень хорошо знает, что я могу изменить параметры group_concat_max_len увеличить этот лимит:

SET SESSION group_concat_max_len = 1000000; 

Однако на сервере я использую, я не могу изменить любого из параметров. Не используя предыдущий запрос, а не редактируя любой файл конфигурации.

Так что мой вопрос: Есть ли другой способ получить результат запроса нескольких строк в одну строку?

+1

Вы имеете в виду кроме работы на стороне клиента? – lexu

+24

Спасибо, друг ...ваш вопрос - ответ на мой вопрос :) –

+0

Вы, кажется, уже выбрали ответ, но из любопытства почему вы не можете использовать оператор 'SET' для изменения переменной сеанса? –

ответ

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'); 

Этот запрос немного странный, но для инициализации переменной не требуется другой запрос; и он может быть встроен в более сложный запрос. Он возвращает все «поле2», разделенное точкой с запятой.

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

Это отличный ответ, но не совсем закончен вопрос - вот как получить очень длинный конкат, но как насчет группировки? Ваш запрос возвращает только одну строку, а не одну строку для каждой группы. – Benubird

+0

Я помню, что это то, что я пытался сделать, - весь набор результатов в одну строку. – ZeWaren

+8

@Benubird это очень плохой запрос. и плохим я имею в виду ужасное. OP выполняет коррелированный подзапрос, который имеет подзапрос, который находится внутри подзапроса. если бы вы исследовали это путем сравнения данных, у вас было бы 256 сравнений по его выборке данных, ака 4 строки. Теперь представьте, если у вас есть 1k строк, что составляет 1 триллион сравнений. –

262
SET SESSION group_concat_max_len = 1000000; 

является временной, сеансовой область применения, установка. Это относится только к текущему сеансу. Вы должны использовать его так.

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

Вы можете сделать это даже в разделе хостинг, но когда вы используете другой сеанс, необходимо повторить команду SET SESSION.

+3

Я предпочел использовать GLOBAL вместо SESSION: 'SET GLOBAL group_concat_max_len = 6999' , чтобы сделать параметр действительным для запросов – IcedDante

+2

Rackspace и другие облачные серверы не позволяют использовать глобальный доступ. Я пытаюсь использовать jdbc.execute ("SET SESSION group_concat_max_len = ..."); внутри метода инициализации Dao, но, как сказал keatkeat, это только временное. Если кто-то знает правильный способ сделать это изменение навсегда PLS, дайте мне знать – IcedDante

+0

Удивительная работа !!!!!!!!!!! .. Спасибо, что так много ... работал как шарм !!!! –

35

Правильный параметр задает максимальную длину составляет:

SET @@group_concat_max_len = value_numeric; 

value_numeric должен быть> тысяча двадцать четыре; по умолчанию значение group_concat_max_len 1024.

+2

SET SESSION и SET GLOBAL не работали на определенном сервере, но это было сделано! благодаря! – mfink

+0

Это сработало, пока другие предложения не были @ ** MySQL Server 5.1.41 ** (я знаю, что это старая версия) –

+1

Вы можете установить 'group_concat_max_len' как ** 4 **. ([mysql docs] (http://dev.mysql.com/doc/refman/5.7/en/server-system-variables.html#sysvar_group_concat_max_len)). «Значение value_numeric' должно быть> = 4» здесь. Я действительно использовал это, чтобы проверить, что произойдет, когда вы превысите значение 'group_concat_max_len'. –

2

Правильный синтаксис MySQL>SET @@global.group_concat_max_len = integer;
Если вы не имеете права делать это на сервере, в котором база данных постоянно находится затем использовать запрос:
MYSQL = "SET @@session.group_concat_max_len = 10000;" или другое значение.
Следующая строка:
SET objRS = objConn.Execute(mySQL)   Ваши переменные могут отличаться.
затем
mySQL="SELECT GROUP_CONCAT(......);" и т.д.
Я использую последнюю версию, так как я не имею права изменить значение по умолчанию 1024 глобально (с помощью Cpanel).
Надеюсь, это поможет.

+0

Что-то, чего вы не одобрили здесь, Атаур Рахман Мунна? –

0

Вы можете попробовать это

SET GLOBAL group_concat_max_len = 1000000; 
2

Включите этот параметр в XAMPP my.ini файле конфигурации:

[туздЫ] group_concat_max_len = +1000000

Затем перезапустить XAMPP MySQL

Смежные вопросы