複数の MySQL 行を 1 つのフィールドに連結できますか? 質問する

複数の MySQL 行を 1 つのフィールドに連結できますか? 質問する

を使用するとMySQL、次のようなことができます。

SELECT hobbies FROM peoples_hobbies WHERE person_id = 5;

私の出力:

shopping
fishing
coding

代わりに、1 行 1 列だけが欲しいのです:

期待される出力:

shopping, fishing, coding

その理由は、複数のテーブルから複数の値を選択し、すべての結合後に、必要な行数よりもはるかに多くの行が作成されるためです。

私は機能を探しましたMySQL ドキュメントCONCATまた、またはCONCAT_WS関数は結果セットを受け入れないようです。

それで、ここにいる誰かこれをどうやって行うのか知っていますか?

ベストアンサー1

使用できますGROUP_CONCAT:

SELECT person_id,
   GROUP_CONCAT(hobbies SEPARATOR ', ')
FROM peoples_hobbies
GROUP BY person_id;

ルートヴィヒが述べたように彼のコメント、重複を避けるために演算子を追加できますDISTINCT:

SELECT person_id,
   GROUP_CONCAT(DISTINCT hobbies SEPARATOR ', ')
FROM peoples_hobbies
GROUP BY person_id;

ジャンが述べたように彼らのコメント、次のようにして、値を並べ替えることもできますORDER BY

SELECT person_id, 
       GROUP_CONCAT(hobbies ORDER BY hobbies ASC SEPARATOR ', ')
FROM peoples_hobbies
GROUP BY person_id;

ダグが述べたように彼のコメント、結果には 1024 バイトの制限があります。これを解決するには、クエリの前に次のクエリを実行します。

SET group_concat_max_len = 2048;

もちろん、2048必要に応じて変更できます。値を計算して割り当てるには、次のようにします。

SET group_concat_max_len = CAST(
                     (SELECT SUM(LENGTH(hobbies)) + COUNT(*) * LENGTH(', ')
                           FROM peoples_hobbies
                           GROUP BY person_id) AS UNSIGNED);

おすすめ記事