129

MySQL に次のデータを含むテーブルがあるとします。

id       Name       Value
1          A          4
1          A          5
1          B          8
2          C          9

次の形式にするにはどうすればよいですか?

id         Column
1          A:4,5,B:8
2          C:9


使わないといけないと思いますGROUP_CONCAT。しかし、それがどのように機能するかはわかりません。

4

7 に答える 7

174
select id, group_concat(`Name` separator ',') as `ColumnName`
from
(
  select 
    id, 
    concat(`Name`, ':', group_concat(`Value` separator ',')) as `Name`
  from mytbl
  group by 
    id, 
    `Name`
) tbl
group by id;

ここで実装されていることがわかります: Sql Fiddle Demo。まさにあなたが必要とするもの。

Splitting を 2 つのステップで更新します。最初に、unique[Name,id] に対してすべての値 (カンマ区切り) を持つテーブルを取得します。次に、取得したテーブルから、すべての名前と値を一意の ID ごとに 1 つの値として取得します。こちらで説明されているSQL Fiddle Demoを参照してください(結果セットが 2 つあるため、下にスクロールします)

編集質問の読み方に誤りがありました。id だけでグループ化していました。ただし、値を連結して名前と ID でグループ化し、さらに ID でグループ化する場合は、2 つの group_contacts が必要です。前回の回答は

select 
id,group_concat(concat(`name`,':',`value`) separator ',')
as Result from mytbl group by id

ここで実装されていることがわかります:SQL Fiddle Demo

于 2012-11-19T10:33:11.880 に答える
23

試す:

CREATE TABLE test (
  ID INTEGER,
  NAME VARCHAR (50),
  VALUE INTEGER
);

INSERT INTO test VALUES (1, 'A', 4);
INSERT INTO test VALUES (1, 'A', 5);
INSERT INTO test VALUES (1, 'B', 8);
INSERT INTO test VALUES (2, 'C', 9);

SELECT ID, GROUP_CONCAT(NAME ORDER BY NAME ASC SEPARATOR ',')
FROM (
  SELECT ID, CONCAT(NAME, ':', GROUP_CONCAT(VALUE ORDER BY VALUE ASC SEPARATOR ',')) AS NAME
  FROM test
  GROUP BY ID, NAME
) AS A
GROUP BY ID;

SQL フィドル: http://sqlfiddle.com/#!2/b5abe/9/0

于 2012-11-19T10:20:56.030 に答える
9
SELECT ID, GROUP_CONCAT(CONCAT_WS(':', NAME, VALUE) SEPARATOR ',') AS Result 
FROM test GROUP BY ID
于 2014-12-22T13:20:36.257 に答える
6

まず、一意でない ID を持つ理由がわかりませんが、別のテーブルに接続する ID だと思います。次に、サーバーに負担をかけるサブクエリが不要になります。このように、1 つのクエリでこれを行います。

SELECT id,GROUP_CONCAT(name, ':', value SEPARATOR "|") FROM sample GROUP BY id

高速で正確な結果が得られ、その SEPARATOR "|" で結果を分割できます。文字列内で見つけることが不可能なため、私は常にこのセパレーターを使用しています。したがって、それは一意です。2 つの A があっても問題ありません。値のみを識別します。または、文字を使用してもう 1 つの列を作成することもできます。これはさらに優れています。このような :

SELECT id,GROUP_CONCAT(DISTINCT(name)), GROUP_CONCAT(value SEPARATOR "|") FROM sample GROUP BY name
于 2017-08-14T16:55:15.307 に答える