이 글은 2년 이상 지난 이야기에요. 읽으실때 참고!
MySQL GROUP_CONCAT 기능으로 쿼리 결과를 하나로 합치기

마찬가지로 이전글에 이어서 작업로그 남깁니다.

 

 

두개의 테이블을 조인해야하는 경우가 발생했습니다. 근데 데이터가 1:n으로 표현회어야 하는 상황인데, 추가쿼리를 돌리지 않고 n에 해당하는 여러행의 쿼리결과를 하나로 합쳐야 하는 상황이었습니다.

 

게시글 하나에 여러개의 댓글이 달리는 경우이고 이 때 댓글의 내용검색을 하기위해서 댓글 내용을 하나의 값으로 합쳐서 뷰를 짜야했었습니다.

 

1
2
CREATE OR REPLACE VIEW SOCIETY_VIEW AS SELECT *, (SELECT GROUP_CONCAT(COALESCE(COMT_NOTE, '') SEPARATOR ' 'FROM SOCIETY_COMMENT WHERE COMT_DOM_KEY=SOCT_KEY) SOCT_COMT_NOTE FROM SOCIETY
 
cs

 

GROUP_CONCAT 역시 널값은 대체하지 못하는 속성이 있어서 COALESCE 함수를 통해 공백문자 치환을 해두고 위와 같이 컬럼을 재구성했습니다.

 

게시글 a에 댓글이 b, c, d, e라는 내용으로 적혀있으면 위의 뷰는 게시글 a의 테이블정보와 더불어 SOCT_COMT_NOTE라는 컬럼에 "b c d e"라는 값이 1:1로 조인되어 뷰가 생성됩니다.

GROUP_CONCAT의 구분자는 기본이 ','이며 내부 파라미터에 SEPARATOR ''를 통해 원하는 구분자로 바꿀 수 있습니다. 위의 경우에는 공백문자로 치환했습니다.

 

이렇게 뷰를 구성해두면 댓글 내용 검색시 일일히 수많은 댓글을 조회하는 쿼리문 작성은 필요없겠죠.

대규모 시스템에선 성능도 고려해야하긴합니다만, 지금 적용중인 시스템은 규모가 많아도 1만개 이하의 내용이라 핸들링 가능한 부분입니다.

 

 

그리고 GROUP_CONCAT의 병합 데이터의 길이는 1024가 기본값이어서 어느정도 내용이 커지는 경우는 이 값을 바꿔줄 필요가 있습니다.

 

1
2
3
SET GLOBAL group_concat_max_len = 1000000;
SET SESSION group_concat_max_len = 1000000;
 
cs

 

최대값은 Mysql 5.5.3 이상의 64bit 환경에서는 18446744073709551615(...헐) 까지 설정할 수 있습니다.

 

D.2019-09-03 V.317