[英]How to use GROUP_CONCAT in a CONCAT in MySQL
如果我在 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 Demo 。 正是您所需要的。
分兩步更新拆分。 首先,我們得到一個表,其中包含針對唯一 [Name,id] 的所有值(逗號分隔)。 然后從獲得的表中,我們將所有名稱和值作為針對每個唯一 id 的單個值,參見此處解釋的SQL Fiddle Demo (向下滾動,因為它有兩個結果集)
編輯閱讀問題時出錯,我僅按 id 分組。 但是如果(值要按名稱和 id 分組,然后按 id 分組),則需要兩個 group_contacts。 之前的回答是
select
id,group_concat(concat(`name`,':',`value`) separator ',')
as Result from mytbl group by id
你可以在這里看到它的實現: SQL Fiddle Demo
嘗試:
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
SELECT ID, GROUP_CONCAT(CONCAT_WS(':', NAME, VALUE) SEPARATOR ',') AS Result
FROM test GROUP BY ID
首先,我看不出有一個不唯一的 ID 的原因,但我猜它是一個連接到另一個表的 ID。 其次,不需要子查詢,這會打敗服務器。 您在一個查詢中執行此操作,如下所示
SELECT id,GROUP_CONCAT(name, ':', value SEPARATOR "|") FROM sample GROUP BY id
你得到快速和正確的結果,你可以用分隔符“|”分割結果。 我總是使用這個分隔符,因為不可能在字符串中找到它,因此它是唯一的。 有兩個 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 函數將一個字符串插入到另一個字符串中。 它在起始位置刪除第一個字符串中指定長度的字符,然后將第二個字符串插入到起始位置的第一個字符串中。
STUFF 函數如下所示: STUFF (character_expression , start , length ,character_expression )
character_expression 是字符數據的表達式。 character_expression 可以是常量、變量或字符或二進制數據的列。
start 是一個整數值,指定開始刪除和插入的位置。 如果 start 或 length 為負,則返回空字符串。 如果 start 比第一個 character_expression 長,則返回空字符串。 start 可以是 bigint 類型。
length 是一個整數,指定要刪除的字符數。 如果長度比第一個 character_expression 長,則刪除直到最后一個 character_expression 中的最后一個字符。 length 可以是 bigint 類型。
SELECT
id,
Group_concat(`column`)
FROM
(SELECT
id,
Concat(`name`, ':', Group_concat(`value`)) AS `column`
FROM mytbl
GROUP BY id, name) tbl
GROUP BY id;
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.