2010-04-02 108 views
187

我在一個MySQL查詢中使用GROUP_CONCAT()將多行轉換爲單個字符串。 但是,該函數的最大結果長度爲1024個字符。MySQL和GROUP_CONCAT()的最大長度

我非常清楚地知道,我可以改變帕拉姆group_concat_max_len增加此限制:

SET SESSION group_concat_max_len = 1000000; 

不過,我使用的服務器上,我不能改變任何PARAM。不是通過使用前面的查詢而是通過編輯任何配置文件。

所以我的問題是: 是否有任何其他方式來獲取多行查詢輸出到單個字符串?

+1

你的意思是除了做客戶端的工作? – lexu 2010-04-02 18:37:25

+24

感謝好友...你的問題是我的問題的答案:) – 2013-04-13 11:25:34

+0

你似乎已經選擇了一個答案,但出於好奇,爲什麼你不能使用'SET'語句來更改會話變量? – 2013-08-21 06:49:34

回答

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

這個查詢有點奇怪,但它不需要另一個查詢來初始化變量;它可以嵌入到更復雜的查詢中。 它返回所有'field2的分號分隔符。

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

這是一個很好的答案,但並沒有完成問題 - 這是如何得到一個很長的concat,但是分組呢?您的查詢只返回一行,而不是每組一行。 – Benubird 2013-04-24 15:07:59

+0

我記得那就是我正在嘗試做的 - 將整個結果集放到一個字符串中。 – ZeWaren 2013-04-25 09:01:01

+8

@Benubird這是一個非常糟糕的查詢。我的意思是糟透了。 OP正在做一個相關的子查詢,它在子查詢中有一個子查詢。如果你要通過數據比較來檢查,你可以在他的樣本數據集(又名4行)上進行256次比較。現在想象一下,如果你有1k行,那就是1萬億次比較。 – 2014-11-07 15:19:36

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 2014-10-07 19:48:10

+2

Rackspace和其他雲服務器不允許GLOBAL訪問。我嘗試使用jdbc.execute(「SET SESSION group_concat_max_len = ...」);在Dao初始化方法中,但keatkeat聲明,這只是暫時的。如果有人知道正確的方法,讓永久變更請讓我知道 – IcedDante 2014-11-18 22:42:26

+0

令人敬畏的工作!!!!!!!!!!! ..非常感謝你......像魅力一樣工作! – 2017-01-03 06:00:06

35

正確的參數設置的最大長度爲:

SET @@group_concat_max_len = value_numeric; 

value_numeric必須> 1024;默認情況下,group_concat_max_len值爲1024

+2

SET SESSION和SET GLOBAL在某個服務器上不起作用,但是這樣做!謝謝! – mfink 2015-06-19 04:14:51

+0

這個工作,而其他建議沒有@ ** MySQL服務器5.1.41 **(我知道這是一箇舊版本) – 2016-01-28 07:57:03

+1

你實際上可以設置'group_concat_max_len'低至** 4 **。 ([mysql文檔](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'值時會發生什麼。 – 2016-11-18 18:15:26

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(......);" etc
我使用最後一個版本,因爲我沒有權限更改全局默認值1024(使用cPanel)。
希望這會有所幫助。

+0

你在這裏不贊成的東西Ataur Ra​​hman Munna? – 2016-10-31 07:36:30

0

你可以試試這個

SET GLOBAL group_concat_max_len = 1000000; 
2

包括在XAMPP的my.ini配置文件設定:

的[mysqld] group_concat_max_len = 1000000

然後,重新啓動mysql的XAMPP