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를 통한 구분자 설정 방법을 통해 다양한 데이터 처리 상황에 대응할 수 있습니다.
함께보면 좋은글
'Language > SQL' 카테고리의 다른 글
[MYSQL] 같은/다른 테이블에서 원하는 행들 복사 붙여넣기 (2) | 2022.09.14 |
---|---|
[MYSQL] 검색한 결과를 넣기 select 하여 insert (0) | 2022.08.09 |
[MYSQL] insert, update 시 특수문자 입력하기 (0) | 2022.07.05 |
[MYSQL] 지정한 범위에서 연속 숫자 증가 업데이트(update) 하기 (0) | 2022.06.03 |
[MYSQL] 검색한 결과 여러개 한번에 삭제 Delete 와 select에서 IN 사용하기 (0) | 2021.11.09 |