source

MySQL의 CONCAT에서 GROUP_CONCAT를 사용하는 방법

manycodes 2022. 11. 5. 09:03
반응형

MySQL의 CONCAT에서 GROUP_CONCAT를 사용하는 방법

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 피들 Demo 。바로 네가 필요한 거야

분할을 2단계로 갱신합니다.먼저 모든 값(콤마 구분)을 일의[이름, id]와 대조한 표를 얻습니다.그런 다음 얻은 표에서 각 고유 ID에 대해 모든 이름과 값을 단일 값으로 가져옵니다.여기서 설명하는 SQL Fidle Demo (2개의 결과 세트가 있으므로 아래로 스크롤)

편집 질문을 읽는 동안 오류가 발생했습니다. ID로만 그룹화했습니다.단, (값은 이름과 id로 그룹화된 후 id로 모두 연결되어야 하는 경우)에는 2개의 group_contacts가 필요합니다.이전 답변은

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

SQL 피들 데모의 실장은 이쪽에서 보실 수 있습니다.

시험:

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 Fider: http://sqlfiddle.com/ #!2/b5abe/9/0

SELECT ID, GROUP_CONCAT(CONCAT_WS(':', NAME, VALUE) SEPARATOR ',') AS Result 
FROM test GROUP BY ID

우선 아이디가 특이하지 않은 이유는 모르겠지만 다른 테이블로 연결되는 아이디인 것 같아요.둘째, 서버를 두들겨 패는 서브쿼리가 필요하지 않습니다.한 번의 쿼리에서 이 작업을 수행합니다.

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

빠르고 정확한 결과를 얻을 수 있습니다.그리고 그 결과를 SEPERATOR "|"로 나눌 수 있습니다.이 세퍼레이터는 항상 사용하고 있습니다.문자열 안에서 찾을 수 없기 때문에 이 세퍼레이터는 항상 이 세퍼레이터를 사용합니다.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와 같은 프로그램으로 다시 한 번 결과를 처리해야 합니다.

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; 

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 함수는 문자열을 다른 문자열에 삽입합니다.첫 번째 문자열의 시작 위치에서 지정된 길이의 문자를 삭제하고 두 번째 문자열을 시작 위치의 첫 번째 문자열에 삽입합니다.

STUP 함수는 다음과 같습니다.SUP ( character _ expression , start , length , character _ expression )

character_expression 문자 데이터의 표현입니다.character_interion은 문자 또는 이진 데이터의 상수, 변수 또는 열일 수 있습니다.

start는 삭제 및 삽입을 시작할 위치를 지정하는 정수값입니다.시작 또는 길이가 음수인 경우 늘 문자열이 반환됩니다.시작이 첫 번째 character_expression보다 길면 null 문자열이 반환됩니다.start는 bigint 유형일 수 있습니다.

length는 삭제할 문자 수를 지정하는 정수입니다.길이가 첫 번째 character_expression보다 길면 마지막 character_expression의 마지막 문자까지 삭제됩니다.길이는 bigint 유형일 수 있습니다.

언급URL : https://stackoverflow.com/questions/13451605/how-to-use-group-concat-in-a-concat-in-mysql

반응형