MySQLおよびGROUP_CONCAT()の最大長


260

私は使っています GROUP_CONCAT()MySQLクエリで複数の行を単一の文字列に変換するためにしています。ただし、この関数の結果の最大長は1024文字です。

group_concat_max_lenこの制限を増やすためにパラメーターを変更できることは非常によく承知しています。

SET SESSION group_concat_max_len = 1000000;

ただし、使用しているサーバーでは、パラメーターを変更できません。上記のクエリを使用したり、構成ファイルを編集したりすることはありません。

だから私の質問は:複数行クエリの出力を単一の文字列に取得する他の方法はありますか?


1
クライアント側の仕事以外のことですか?
lexu

40
ありがとうバディ...あなたの質問は私の質問への答えです:)
Mansoorkhan Cherupuzha

すでに回答を選択しているようですが、好奇心から、SETステートメントを使用してセッション変数を変更できないのはなぜですか?
ビルカーウィン2013

2
それは、私が作成しなければならないクエリが、いくつかの腐った自家製phpフレームワークに埋め込まれていて、他の部分を編集することが許可されていなかったためです。このプロジェクトのコーディング方法は本当に恥ずかしかったです。
ZeWaren 2013

1
group_concat関数を使用すると、文字列がreturn breakだったのに、この関数が限られた数のcharを返すとは
知り

回答:


335
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コマンドを繰り返す必要があります。


4
私はSESSIONではなくGLOBALを使用SET GLOBAL group_concat_max_len=6999することを選択しました。クエリ全体で設定を有効にするため
IcedD​​ante

2
Rackspaceおよびその他のクラウドサーバーでは、GLOBALアクセスは許可されていません。jdbc.execute( "SET SESSION group_concat_max_len = ...");を使用してみます。Daoのinitializeメソッドの内部ですが、キートキートが述べたように、これは一時的なものです。この変更を永続的に行う正しい方法を誰かが知っている場合は、plsに知らせてください
IcedD​​ante 2014年

61

最大長を設定するための正しいパラメーターは次のとおりです。

SET @@group_concat_max_len = value_numeric;

value_numeric1024以上である必要があります。デフォルトでは、group_concat_max_len値は1024です。


3
SET SESSIONとSET GLOBALは特定のサーバーでは機能しませんでしたが、これは機能しました!ありがとう!
mfink 2015年

これは機能しましたが、他の提案では機能しませんでしたが、MySQL Server 5.1.41(古いバージョンであることは知っています
low_rents

2
実際にgroup_concat_max_len4まで設定できます。(mysql docs)。「value_numericでなければならない> = 4」ここケースです。実際にこれを使用して、group_concat_max_len値を超えたときに何が起こるかをテストしました。
トーマスF

1
私は、このパラメータは絶対であることを確認することができませリブート防:mysqlのが再起動されると、プロパティは1024にresettedされているので、-1私のために
フレデリック・

2
@NoWay mysqlの再起動時に設定を適用するには、設定ファイル(my.cnfなど)に値を設定する必要があります。SET再起動後にクエリが設定に影響することはありません。
バトルButkus


8

あなたはこれを試すことができます

SET GLOBAL group_concat_max_len = 1000000;

私はこれを私のdbのsqlyogクライアントで実行していますが、反映されていません。しかし、Javaプログラムで実行するとうまくいくようです
Jerry

5

正しい構文は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(......);"など
私は(cPanelのを使用して)グローバル1024のデフォルト値を変更する権限を持っていないので、私は最後のバージョンを使用しています。
お役に立てれば。


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

このクエリは少し奇妙ですが、変数を初期化するための別のクエリは必要ありません。より複雑なクエリに埋め込むことができます。セミコロンで区切られたすべての '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
これは素晴らしい答えですが、質問を完全に終えるわけではありません-これは非常に長い連結を取得する方法ですが、グループ化についてはどうですか?クエリは、グループごとに1行ではなく、1行のみを返します。
Benubird 2013

それが私がやろうとしていたことを覚えています-結果セット全体を単一の文字列に取得します。
ZeWaren 2013

9
@Benubirdこれは非常に悪いクエリです。そして悪いことには私はひどいことを意味します。OPは、サブクエリ内にあるサブクエリを持つ相関サブクエリを実行しています。データ比較によってそれを調べるとしたら、彼のサンプルデータセット(別名4行)には256の比較があります。1k行と1兆の比較があるとしましょう。
John Ruddell、2014年

@JohnRuddellええ、そうです。このクエリが深刻なライブシステムの内部に近いことは間違いありません。当時、私はある種の挑戦/練習のためにそれを必要としていました。
ZeWaren 2014年

5
Ah gotcha ..他の通行人のためにそれを書き留めておくことをお勧めします...この回答は誤解を招くので:)興味深い試み
John Ruddell 14年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.