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
を使わなければならないと思います。しかし、私はそれがどのように機能するのかわからない。
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デモ 。まさにあなたが必要とするもの。
更新2つのステップに分けます。まず、一意の[Name、id]に対してすべての値(コンマ区切り)を持つテーブルを取得します。次に、取得したテーブルから、すべての名前と値をそれぞれの一意のIDに対する単一の値として取得します。ここで説明されている説明を参照してください。 SQL Fiddleデモ (2つの結果セットがあるので下にスクロールします)
編集質問を読むのに間違いがありました、私はidだけでグループ化しました。ただし、2つのgroup_contactsが必要です(値はNameとidでグループ化され、次にidでグループ化されます)。 前回の回答はでした
select
id,group_concat(concat(`name`,':',`value`) separator ',')
as Result from mytbl group by id
ここで実装されているのがわかります: SQL Fiddleデモ
試してください:
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/
SELECT ID, GROUP_CONCAT(CONCAT_WS(':', NAME, VALUE) SEPARATOR ',') AS Result
FROM test GROUP BY ID
まず第一に、私はユニークではないIDを持つ理由がわかりませんが、私はそれが別のテーブルに接続するIDだと思います。第二に、サブクエリが不要になり、サーバを圧迫します。このように1回のクエリでこれを行います。
SELECT id,GROUP_CONCAT(name, ':', value SEPARATOR "|") FROM sample GROUP BY id
あなたは速くて正しい結果を得ます、そしてあなたはそのSEPARATOR "|"で結果を分割することができます。私はいつもこの区切り記号を使います、なぜならそれは文字列の中でそれを見つけることは不可能だからです。 2つのAを持っていても問題はありません。値だけを識別します。あるいは、あなたはその手紙と共にもう一つのコラムを持つことができます。このような :
SELECT id,GROUP_CONCAT(DISTINCT(name)), GROUP_CONCAT(value SEPARATOR "|") FROM sample GROUP BY name
SELECT id, GROUP_CONCAT(CONCAT_WS(':', Name, CAST(Value AS CHAR(7))) SEPARATOR ',') AS result
FROM test GROUP BY id
キャストまたは変換を使用する必要があります。それ以外の場合はBLOBが返されます。
結果は
id Column
1 A:4,A:5,B:8
2 C:9
pythonやJavaなどのプログラムで結果をもう一度処理する必要があります。
IF OBJECT_ID('master..test') is not null Drop table test
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 distinct NAME , LIST = Replace(Replace(Stuff((select ',', +Value from test where name = _a.name for xml path('')), 1,1,''),'<Value>', ''),'</Value>','') from test _a order by 1 desc
私のテーブル名はtestです。連結のために私はFor XML Path( '')構文を使います。 stuff関数は、文字列を別の文字列に挿入します。開始位置の最初の文字列の指定された長さの文字を削除してから、開始位置の最初の文字列に2番目の文字列を挿入します。
STUFF関数は次のようになります。STUFF(character_expression、start、length、character_expression)
character_expression文字データの式です。 character_expressionは、文字データまたはバイナリデータの定数、変数、または列です。
start削除と挿入を開始する場所を指定する整数値です。開始または長さが負の場合、NULL文字列が返されます。 startが最初のcharacter_expressionよりも長い場合は、NULL文字列が返されます。 startはbigint型です。
length削除する文字数を指定する整数です。長さが最初のcharacter_expressionよりも長い場合、削除は最後のcharacter_expressionの最後の文字まで行われます。長さはbigint型にすることができます。