web-dev-qa-db-ja.com

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

MySQLを使って、私は以下のようなことができます。

SELECT hobbies FROM peoples_hobbies WHERE person_id = 5;

私の出力:

shopping
fishing
coding

しかし、代わりに、1行1列が必要です。

予想される出力:

shopping, fishing, coding

その理由は、私は複数のテーブルから複数の値を選択していて、すべての結合の後に、必要以上に多くの行があるからです。

MySQL Doc で関数を探しましたが、CONCAT関数またはCONCAT_WS関数が結果セットを受け入れるようには見えません。

1077
Dean Rather

GROUP_CONCAT を使用できます。

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

Ludwigが 彼のコメントで述べたように あなたは重複を避けるためにDISTINCT演算子を追加することができます:

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

Janが のコメントで述べたように、ORDER BYを使って暗黙のうちに値をソートすることもできます。

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

Dagが 彼のコメントで述べたように 結果には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
);
1553
che

MySQLのバージョン(4.1)でサポートされている場合はGROUP_CONCATをご覧ください。詳しくは ドキュメント をご覧ください。

それは次のようになります。

  SELECT GROUP_CONCAT(hobbies SEPARATOR ', ') 
  FROM peoples_hobbies 
  WHERE person_id = 5 
  GROUP BY 'all';
93
lpfavreau

複数、個々の行を連結するための代替構文

警告:この投稿はあなたをお腹を空かせます。

与えられた:

私は自分自身が グループではなく複数の個々の行 - を選択し、特定のフィールドに連結することを望んでいることに気づきました。

商品IDとその名前と価格の表があるとします。

+------------+--------------------+-------+
| product_id | name               | price |
+------------+--------------------+-------+
|         13 | Double Double      |     5 |
|         14 | Neapolitan Shake   |     2 |
|         15 | Animal Style Fries |     3 |
|         16 | Root Beer          |     2 |
|         17 | Lame T-Shirt       |    15 |
+------------+--------------------+-------+

それから、あなたはチェックボックスとしてこれらの子犬をリストにしている若干の空想的 - シュマンシーなajaxを持っています。

空腹のカバユーザーは13, 15, 16を選択します。今日の彼女のデザートはありません...

見つける:

純粋なmysqlを使って、ユーザーの注文を一行にまとめる方法。

溶液:

GROUP_CONCATthe IN と共に使用します。

mysql> SELECT GROUP_CONCAT(name SEPARATOR ' + ') AS order_summary FROM product WHERE product_id IN (13, 15, 16);

どの出力:

+------------------------------------------------+
| order_summary                                  |
+------------------------------------------------+
| Double Double + Animal Style Fries + Root Beer |
+------------------------------------------------+

ボーナスソリューション:

合計金額も必要な場合は、 SUM() に入れてください。

mysql> SELECT GROUP_CONCAT(name SEPARATOR ' + ') AS order_summary, SUM(price) AS total FROM product WHERE product_id IN (13, 15, 16);
+------------------------------------------------+-------+
| order_summary                                  | total |
+------------------------------------------------+-------+
| Double Double + Animal Style Fries + Root Beer |    10 |
+------------------------------------------------+-------+

シモンズ: In-N-Out 近くにない場合は謝罪...

62

GROUP_CONCATパラメーターを設定することで、group_concat_max_len値の最大長を変更できます。

詳細は MySQLのドキュメント を参照してください。

35
pau.moreno

GROUP集約関数、 GROUP_CONCAT があります。

25
Dean Rather

私の場合、Idの行があり、それをcharにキャストする必要がありました。それ以外の場合、結果はバイナリ形式にエンコードされました:

SELECT CAST(GROUP_CONCAT(field SEPARATOR ',') AS CHAR) FROM table
22
Fedir RYKHTIK

次のようにMySQL(5.6.13)セッション変数と代入演算子を使用してください。

SELECT @logmsg := CONCAT_ws(',',@logmsg,items) FROM temp_SplitFields a;

それからあなたは得ることができます

test1,test11
14
Shen liang

私はもっ​​と複雑なクエリを使っていましたが、それを機能させるためには外側のクエリでGROUP_CONCATを使わなければならないことがわかりました。

元のクエリ:

SELECT DISTINCT userID 
FROM event GROUP BY userID 
HAVING count(distinct(cohort))=2);

破綻した:

SELECT GROUP_CONCAT(sub.userID SEPARATOR ', ') 
FROM (SELECT DISTINCT userID FROM event 
GROUP BY userID HAVING count(distinct(cohort))=2) as sub;

これが誰かに役立つかもしれないことを願っています。

12
Alex Bowyer

これを試して:

DECLARE @Hobbies NVARCHAR(200) = ' '

SELECT @Hobbies = @Hobbies + hobbies + ',' FROM peoples_hobbies WHERE person_id = 5;
7
thejustv

副問い合わせでGROUP_CONCATを使用する方法をここで探している誰かのために - この例を投稿する

SELECT i.*,
(SELECT GROUP_CONCAT(userid) FROM favourites f WHERE f.itemid = i.id) AS idlist
FROM items i
WHERE i.id = $someid

そのため、GROUP_CONCATはラッピングではなくサブクエリ内で使用する必要があります。

0
Oleg Abrazhaev

mySqlで列を連結する方法は2つあります。

select concat(hobbies) as `Hobbies` from people_hobbies where 1

または

select group_concat(hobbies) as `Hobbies` from people_hobbies where 1
0
raghavendra