Language/SQL

[MYSQL] GROUP_CONCAT에서 order by 정렬하기, 구분자, 한글깨짐

멱군 2022. 8. 4. 11:41

MySQL에서 데이터를 그룹화하며 연결하는 작업은 매우 흔한 일입니다. 이때 자주 사용되는 함수가 바로 GROUP_CONCAT()입니다. 그러나 GROUP_CONCAT()을 사용하다 보면 몇 가지 문제에 직면하게 됩니다. 예를 들어, 기본적으로 제공되는 순서가 무작위일 수 있고, 특정 구분자를 사용하고 싶을 때, 또는 한글과 같은 문자가 깨지는 현상 등이 그것입니다. 오늘은 이러한 문제들을 어떻게 해결할 수 있는지에 대해 알아보겠습니다.

 

 

1. 문제의 발단

아래와 같은 테이블이 있습니다. 

col1 col2
1 a하나
2 a하나
3 b둘
4 b둘
5 b둘

다음의 검색쿼리문을 이용해서 검색을 했습니다.

SELECT GROUP_CONCAT(col1) FROM table GROUP BY col2

그랬더니 이러한 결과가 나왔습니다.

2,1
5,3,4

순서가 잘나올때도 있고, 엉터리로 나올때도 있었습니다.

결과가 일정하지 않으면 사용할 수 없겠죠?

이를 해결하기 위해 다음처럼 진행을 했습니다.

 

2. GROUP_CONCAT()에서 ORDER BY를 사용하여 정렬하기

기본적으로 GROUP_CONCAT() 함수는 순서를 보장하지 않습니다. 이를 해결하기 위해서는 ORDER BY 절을 사용해야 합니다.

SELECT GROUP_CONCAT(col1 ORDER BY col1) FROM table GROUP BY col2;

이렇게 하면 col1의 값에 따라 오름차순으로 정렬된 결과를 얻을 수 있습니다.

1,2
3,4,5

필요에 따라 DESC 키워드를 추가하여 내림차순으로 정렬할 수도 있습니다.

2,1
5,3,4

만약 정렬조건을 더 추가 하고 싶으면 ORDER BY col1 ASC, col2 DESC 처럼 ,로 구분해서 더 넣을 수도 있습니다.

 

3. 여러 컬럼의 결합과 한글 깨짐 문제 해결

위의 테이블에서 보이는 두개의 컬럼의 값을 하나로 합치고 싶었습니다.

1-A하나,2-A하나
3-B둘,4-B둘,5-B둘

이렇게 결과가 보이게 말이죠.

그래서 다음과 같은 쿼리문을 짰습니다.

SELECT GROUP_CONCAT(col1, "-", col2 order by col1) FROM table GROUP BY col2

하지만 결과는 예상과는 달리 한글이 깨져서 "1-A@뷃뷉" 이렇게 나옵니다.

이러한 문제는 숫자와 문자를 합쳐서 나오는 문제라고 하네요. 

여러 컬럼의 값을 하나의 문자열로 결합할 때, 숫자와 문자가 혼합되어 한글 깨짐 현상이 발생할 수 있습니다.

이를 해결하기 위해서는 CAST() 함수를 사용하여 숫자형 데이터를 문자형으로 변환해야 합니다.

SELECT GROUP_CONCAT(CAST(col1 AS CHAR), "-", col2 ORDER BY col1) FROM table GROUP BY col2;

이 방법을 사용하면 숫자와 문자가 결합되어도 한글 깨짐 현상 없이 정상적으로 출력됩니다.

 

4. 구분자 변경하기

GROUP_CONCAT() 함수의 기본 구분자는 쉼표(,)입니다. 이를 변경하고 싶을 때는 SEPARATOR 키워드를 사용합니다.

SELECT GROUP_CONCAT(CAST(col1 as char), "-", col2 order by col1 SEPARATOR "/") FROM table GROUP BY col2

이렇게 하면 각 그룹화된 값 사이에 지정한 구분자(/)가 삽입됩니다.

1-A하나/2-A하나
3-B둘/4-B둘/5-B둘

 

결론

GROUP_CONCAT() 함수는 MySQL에서 데이터를 효율적으로 그룹화하고 문자열로 변환하는 데 매우 유용합니다.

오늘 살펴본 ORDER BY를 통한 정렬, CAST() 함수를 사용한 데이터 타입 변환, 그리고 SEPARATOR를 통한 구분자 설정 방법을 통해 다양한 데이터 처리 상황에 대응할 수 있습니다.

 

함께보면 좋은글

 

[MYSQL] 검색결과 값 합치기 (select, CONCAT, GROUP_CONCAT)

MySQL에서 데이터 조작과 관련된 작업을 할 때 종종 여러 컬럼의 값들을 하나로 합치거나, 여러 행의 값을 하나의 행으로 합치는 작업을 필요로 합니다. 이럴 때 유용하게 쓰이는 함수들이 바로 CO

devit.koreacreatorfesta.com