1. ホーム
  2. mysql

[解決済み] MySQLの複数行を1つのフィールドに連結することはできますか?

2022-03-17 05:36:15

質問

使用方法 MySQL というようなことができる。

SELECT hobbies FROM peoples_hobbies WHERE person_id = 5;

私の出力

shopping
fishing
coding

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

期待される出力

shopping, fishing, coding

理由は、複数のテーブルから複数の値を選択しているため、すべての結合の後に、私が望むよりも多くの行があることです。

の関数を探したんだけど MySQLドキュメント というのがないようで CONCAT または CONCAT_WS 関数は結果セットを受け取ります。

そこで、どなたかこの方法をご存じないでしょうか?

どのように解決するのですか?

を使用することができます。 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);