1 はじめに
最近、組織とその下位組織に対して再帰クエリを実行したときに、データ クエリが不完全で、サブ組織のデータを取得できないことがわかりました。調査の結果、group_concat_max_len の長さが不足していることが判明しました (デフォルトでは group_concat_max_len=1024 であるため、このデフォルトのパラメータを変更する必要があります)。
2.SQL文
組織とその下位組織を再帰的にクエリする SQL ステートメントは次のとおりです。
SELECT t3.id,
t3.fatherId,
t3.orgName
FROM(
SELECT @pids as ids,
(
SELECT @pids := GROUP_CONCAT(id)
FROM organizationInfo
WHERE FIND_IN_SET(fatherId, @pids)
) as t1, @l := @l+1 as lNum
FROM organizationInfo, (SELECT @pids := '查询的组织ID', @l := 0 ) t4
WHERE @pids IS NOT NULL
) t2, organizationInfo t3
WHERE FIND_IN_SET(t3.id, t2.ids)
ORDER BY lNum, id
3. group_concat_max_len の長さを問い合わせる
SQL文を実行します
show VARIABLES like 'group_concat_max_len'
4. group_concat_max_len の長さを変更する
4.1. 一時的な変更
set SESSION GROUP_CONCAT_max_len=102400
このコマンドを使用して group_concat_max_len の長さを一時的に変更できますが、この変更はこの接続に対してのみ有効であるため、これは解決策ではありません。
4.2. MySQL 設定ファイルの変更
永続的に有効にするには、MySQL 構成ファイルを変更する必要があります。ここでは Ubuntu を例に挙げます。
コマンドを実行して構成ファイルを変更します。
sudo vim /etc/mysql/mysql.conf.d/mysqld.cnf
[mysqld] の下に次の行を追加します。
group_concat_max_len = 102400
需要を満たすために必要なバイト数がわからない場合があります。この場合、最大バイト数を設定しない (つまり、最大バイト数を使用する) ことを検討できます。これを次のように変更します。
group_concat_max_len=-1
最後に、コマンドを実行してmysqlを再起動します。
sudo service mysql restart