307

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

group_concat_max_lenこの制限を増やすためにパラメータを変更できることを私はよく知っています:

SET SESSION group_concat_max_len = 1000000;

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

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

4

7 に答える 7

378
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

于 2013-08-21T04:08:54.040 に答える
66

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

SET @@group_concat_max_len = value_numeric;

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

于 2015-03-24T21:27:35.357 に答える
23

この設定をxamppmy.ini構成ファイルに含めます。

[mysqld]
group_concat_max_len = 1000000

次に、xamppmysqlを再起動します

于 2017-11-29T14:58:18.720 に答える
15

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

SET GLOBAL group_concat_max_len = 1000000;
于 2017-11-26T15:51:26.997 に答える
5

正しい構文はmysql>SET @@global.group_concat_max_len = integer;
です。データベースが存在するサーバーでこれを行う権限がない場合は、
mySQL="SET @@session.group_concat_max_len = 10000;"または別の値のようなクエリを使用してください。
次の行:
SET objRS = objConn.Execute(mySQL)  変数は異なる場合があります。
次に 、デフォルト値の1024をグローバルに(cPanelを使用して)変更する権限がないため、最後のバージョンを使用します
mySQL="SELECT GROUP_CONCAT(......);"。 お役に立てれば。

于 2016-10-31T05:21:47.970 に答える
3

簡単な答え:MySQLサーバーへの接続が確立されたときに設定をセットアップする必要があります。たとえば、MYSQLi / PHPを使用している場合、次のようになります。

$ myConn = mysqli_init(); 
$ myConn->options(MYSQLI_INIT_COMMAND, 'SET SESSION group_concat_max_len = 1000000');

したがって、自家製のフレームワークを使用している場合は、接続が確立されたときにコード内の場所を探して、適切な値を提供する必要があります。

私はまだ2020年にCodeigniter3を使用しているので、このフレームワークでは、追加するコードはapplication / system / database / drivers / mysqli / mysqli_driver.phpにあり、関数の名前はdb_connect()です。

public function db_connect($persistent = FALSE)
    {
        // Do we have a socket path?
        if ($this->hostname[0] === '/')
        {
            $hostname = NULL;
            $port = NULL;
            $socket = $this->hostname;
        }
        else
        {
            $hostname = ($persistent === TRUE)
                ? 'p:'.$this->hostname : $this->hostname;
            $port = empty($this->port) ? NULL : $this->port;
            $socket = NULL;
        }

        $client_flags = ($this->compress === TRUE) ? MYSQLI_CLIENT_COMPRESS : 0;
        $this->_mysqli = mysqli_init();

        $this->_mysqli->options(MYSQLI_OPT_CONNECT_TIMEOUT, 10);
        $this->_mysqli->options(MYSQLI_INIT_COMMAND, 'SET SESSION group_concat_max_len = 1000000');

...
    }
于 2020-08-03T15:35:51.177 に答える
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; 
于 2010-04-11T20:59:45.543 に答える