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
'source' 카테고리의 다른 글
unzip : "unzip"이라는 용어는 명령어 이름으로 인식되지 않습니다. (0) | 2022.11.05 |
---|---|
Python에서 문자열을 소문자로 만들려면 어떻게 해야 하나요? (0) | 2022.11.05 |
jQuery Select2의 선택한 값을 설정하려면 어떻게 해야 합니다. (0) | 2022.11.05 |
Python의 추상 클래스와 인터페이스의 차이 (0) | 2022.11.05 |
리액트 라우터 v4/v5를 사용한 네스트 루트 (0) | 2022.11.05 |