1391

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

SELECT hobbies FROM peoples_hobbies WHERE person_id = 5;

私の出力:

shopping
fishing
coding

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

期待される出力:

shopping, fishing, coding

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

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

それで、ここで誰かがこれを行う方法を知っていますか?

4

15 に答える 15

1975

使用できます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);
于 2008-11-10T02:48:11.677 に答える
124

GROUP_CONCATMySQL バージョン (4.1) がサポートしているかどうかを確認してください。詳細については、ドキュメントを参照してください。

次のようになります。

  SELECT GROUP_CONCAT(hobbies SEPARATOR ', ') 
  FROM peoples_hobbies 
  WHERE person_id = 5 
  GROUP BY 'all';
于 2008-11-10T02:48:54.560 に答える
41

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

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

于 2010-04-08T11:32:55.043 に答える
31

GROUP 集計関数GROUP_CONCATがあります。

于 2008-11-10T02:48:38.227 に答える
28

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

SELECT CAST(GROUP_CONCAT(field SEPARATOR ',') AS CHAR) FROM table
于 2014-06-10T09:24:31.350 に答える
18

次のように、MySQL(5.6.13) セッション変数と代入演算子を使用します。

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

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

test1,test11
于 2013-09-27T18:47:25.257 に答える
16

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;

これが誰かを助けることを願っています。

于 2015-04-29T16:35:34.430 に答える
10

これを試して:

DECLARE @Hobbies NVARCHAR(200) = ' '

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

TL;DR;

set @sql='';
set @result='';
set @separator=' union \r\n';
SELECT 
@sql:=concat('select ''',INFORMATION_SCHEMA.COLUMNS.COLUMN_NAME  ,''' as col_name,',
INFORMATION_SCHEMA.COLUMNS.CHARACTER_MAXIMUM_LENGTH ,' as def_len ,' ,
'MAX(CHAR_LENGTH(',INFORMATION_SCHEMA.COLUMNS.COLUMN_NAME , '))as  max_char_len',
' FROM ',
INFORMATION_SCHEMA.COLUMNS.TABLE_NAME
) as sql_piece, if(@result:=if(@result='',@sql,concat(@result,@separator,@sql)),'','') as dummy
FROM INFORMATION_SCHEMA.COLUMNS 
WHERE 
INFORMATION_SCHEMA.COLUMNS.DATA_TYPE like '%char%'
and INFORMATION_SCHEMA.COLUMNS.TABLE_SCHEMA='xxx' 
and INFORMATION_SCHEMA.COLUMNS.TABLE_NAME='yyy';
select @result;
于 2015-02-26T15:25:38.097 に答える
0

ここで、私の意図は、 group_concat() 関数を使用せずに文字列連結を適用することでした:

Set @concatHobbies = '';
SELECT TRIM(LEADING ', ' FROM T.hobbies ) FROM 
(
   select 
   Id, @concatHobbies := concat_ws(', ',@concatHobbies,hobbies) as hobbies
   from peoples_hobbies
)T
Order by Id DESC
LIMIT 1

ここ

   select 
   Id, @concatHobbies := concat_ws(', ',@concatHobbies,hobbies) as hobbies
   from peoples_hobbies

戻ります

  Id    hobbies
  1     , shopping
  2     , shopping, fishing
  3     , shopping, fishing, coding

これで、期待される結果は 3 位になりました。だから私は使用して最後の行を取っています

  Order by Id DESC 
  LIMIT 1
  

次に、文字列から最初の「、」も削除しています

 TRIM(LEADING ', ' FROM T.hobbies )
于 2021-11-08T19:04:38.767 に答える