簡體   English   中英

如何在 MySQL 的 CONCAT 中使用 GROUP_CONCAT

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM