일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- 애너테이션
- 인수테스트
- privateapi
- 일급컬렉션
- 스파르타코딩클럽
- DI
- 항해99
- 정적중첩클래스
- 인프콘
- 변경감지
- 9기
- 항해99 9기
- 서버사이드렌더링
- Velog
- Spring
- 비정적중첩클래스
- 싱글톤패턴
- refreshtoken
- IoC
- 지네릭스
- bean
- 다형성
- publicapi
- 스프링컨테이너
- 클라이언트사이드렌더링
- 더티채킹
- github actions
- 자바의정석
- java
- SOLID
- Today
- Total
멈재
[DB, MySQL] 조건에 맞는 값 그룹 형태로 출력 (GROUP_CONCAT) 본문
하나의 그룹에 포함되는 특정 컬럼의 목록들을 조회해야 하는 상황이 종종 있습니다.
아래와 같은 형태의 테이블 스키마 구조를 가지고 있다고 가정해 보겠습니다.
해당 테이블은 납품 업체와 제휴를 맺고 있는 파트너사의 가맹점들이 상품(product_name) 발주 요청을 관리하는 테이블입니다.
CREATE TABLE `order_form` (
`order_form_id` int NOT NULL AUTO_INCREMENT,
`partner_name` varchar(50) NOT NULL,
`partner_code` varchar(20) NOT NULL,
`product_name` varchar(50) NOT NULL,
`request_dt` datetime DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (`order_form_id`)
) ENGINE=InnoDB;
동일한 파트너사에 다양한 가맹점들이 존재할 수 있고 각각의 가맹점은 고유한 키(partner_code)를 가지고 있습니다.
따라서 다음과 같은 값들이 저장되어 있다고 가정해 보겠습니다.
INSERT INTO order_form (partner_name, partner_code, product_name)
VALUES ('스타벅스', 'SB01', '설탕');
INSERT INTO order_form (partner_name, partner_code, product_name)
VALUES ('스타벅스', 'SB01', '시럽');
INSERT INTO order_form (partner_name, partner_code, product_name)
VALUES ('스타벅스', 'SB02', '에스프레소 원두');
INSERT INTO order_form (partner_name, partner_code, product_name)
VALUES ('투썸플레이스', 'TS01', '계랑스푼');
하나의 가맹점이라는 조건을 조회하고 싶을 때에는 이러한 쿼리를 만들어 조회하게 됩니다.
SELECT partner_code,
COUNT(partner_code) AS count
FROM order_form
GROUP BY partner_code;
그런데 각각의 가맹점마다 요청한 상품 목록들을 함께 보여주어야 하는 상황이 생겨버렸습니다.
이럴 때 유용한 함수가 바로 GROUP_CONCAT입니다.
GROUP_CONCAT 함수는 그룹화된 항목의 특정 항목을 연결된 문자열로 반환하는 함수입니다.
https://dev.mysql.com/doc/refman/8.0/en/aggregate-functions.html#function_group-concat
해당 함수를 사용하여 조회를 하게 되면 다음과 같은 결과를 얻을 수 있습니다.
SELECT partner_code,
COUNT(partner_code) AS count,
GROUP_CONCAT(product_name) AS product_name_group
FROM order_form
GROUP BY partner_code;
별도의 설정없이 없다면 각각의 문자들을 쉼표(', ') 구분자로 구분되어 연결 지어 반환하게 됩니다.
아래와 같은 기능들도 가능합니다.
[ 1 ] 중복된 상품명은 한 번만 보이게 조회 ( DISTINCT )
SELECT partner_code,
COUNT(partner_code) AS count,
GROUP_CONCAT(DISTINCT product_name) AS product_name_group
FROM order_form
GROUP BY partner_code;
[ 2 ] 문자열 구분자 변경 ( SEPARATOR )
( 공백 포함한 구분자도 가능합니다 )
SELECT partner_code,
COUNT(partner_code) AS count,
GROUP_CONCAT(DISTINCT product_name SEPARATOR ' ### ') AS product_name_group
FROM order_form
GROUP BY partner_code;
[ 3 ] 정렬 순서 변경 ( ORDER BY )
SELECT partner_code,
COUNT(partner_code) AS count,
GROUP_CONCAT(DISTINCT product_name
ORDER BY product_name DESC
SEPARATOR ' ### ') AS product_name_group
FROM order_form
GROUP BY partner_code;