1. 알고자 하는 것
회사에서 특정 조건으로 데이터를 2개의 그룹으로 그룹핑해서 추출하고, 이를 각각 일괄적으로 업데이트 해야하는 일이 있었다.
즉, 다음과 같은 형태이다.
이 때, 여러 데이터에 대해 콤마(,)로 구분지어 입력값을 넣으면 일괄적으로 업데이트를 처리할 수 있도록 팀 내에서 유틸성 기능을 Admin Page에서 제공하고 있었고, 이로 인해 특정 컬럼으로 그룹핑 된 n개의 데이터를 콤마로 구분지어 추출해야 했다.
이 때 유용하게 활용했던 GROUP_CONCAT 기능을 알아본다.
- GROUP_CONCAT
2. 알게된 것
- 사용자(member)는 여러 물건(product)을 구매할 수 있다.
- 사용자 별로 구매한 물건을 그룹핑해 콤마로 구분지어 출력해보자.
- member 테이블의 데이터는 다음과 같다.
- product 테이블의 데이터는 다음과 같다.
- 우리가 원하는 출력 형태는 다음과 같이 각 사용자별로 구매한 상품 목록을 콤마로 구분지어 나열하는 것이다.
- 단순하게 다음과 같은 쿼리를 날리면 오류가 발생한다.
SELECT member_id, name FROM product GROUP BY member_id;
/**
[42000][1055] Expression #2 of SELECT list is not in GROUP BY clause and contains
nonaggregated column 'study.product.name' which is not functionally dependent on
columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by
**/
- 집계될 수 없는(nonaggregated) name 컬럼을 SELECT 절에 넣었기 때문에 발생한 오류이다.
- COUNT(name)과 같이 name에 대해 집계하는 함수가 아닌 단순히 name 컬럼 자체를 SELECT 절에 넣었으므로, GROUP BY를 통해 집계할 수 없는 쿼리이기 때문이다.
- member_id 기준으로 그룹핑 된 name 목록을 특정 separator로 나열하고자 한다면, GROUP_CONCAT 함수를 사용한다.
SELECT member_id, GROUP_CONCAT(name) FROM product GROUP BY member_id;
- separator 미지정 시 기본 separator는 콤마(,)로 지정되며, 결과는 다음과 같이 원하던 대로 구매한 상품 목록이 콤마로 구분지어 나열된다.
- 특정 separator를 사용하고 싶으면 GROUP_CONCAT(column SEPARATOR '문자') 형태로 지정할 수 있다.
SELECT member_id, GROUP_CONCAT(name SEPARATOR '|') FROM product GROUP BY member_id;
- 중복을 제거해 출력하고 싶으면 GROUP_CONCAT(DISTINCT column) 형태로 제거할 수 있다.
- 정렬해 출력하고 싶으면 GROUP_CONCAT(column ORDER BY column) 형태로 정렬할 수 있다.
3. 정리
- GROUP BY를 통해 그룹핑 된 결과를 특정 separator를 지정해 나열하고자 할 때 GROUP_CONCAT을 사용할 수 있다.
- 미지정 시 기본 separator는 콤마(,)이며, 특정 separator 지정 시 GROUP_CONCAT(column SEPARATOR '문자') 형태로 지정한다.
- 중복을 제거해 출력하고 싶으면 GROUP_CONCAT(DISTINCT column) 형태로 제거할 수 있다.
- 정렬해 출력하고 싶으면 GROUP_CONCAT(column ORDER BY column) 형태로 정렬할 수 있다.
'Database' 카테고리의 다른 글
[Real MySQL, 6장 - 실행계획] type 컬럼 분석 (1) | 2023.12.19 |
---|---|
[Real MySQL, 4장 - 트랜잭션과 잠금] MySQL에서의 트랜잭션 (0) | 2023.10.05 |
[Real MySQL, 3장 - 아키텍처] MySQL에서의 복제(Replication) (0) | 2023.09.22 |
[Real MySQL, 3장 - 아키텍처] MySQL 엔진, 스토리지 엔진 (0) | 2023.09.13 |