n개의 row 로 결과가 출력되는 쿼리를 한 줄의 row에 표현하고 싶은 경우, GROUP_CONCAT을 사용한다.
* SELECT GROUP_CONCAT('칼럼명' SEPARATOR '구분문자')
FROM 테이블명
예를 들어,
쿼리 :
1
2
|
SELECT user_id AS result
FROM user_info;
|
cs |
결과 :
result |
user1 |
user2 |
user3 |
n개의 로우가 출력되는 쿼리에 GROUP_CONCAT 사용시,
쿼리:
1
2
|
SELECT GROUP_CONCAT(user_id SEPARATOR '^') AS result
FROM user_info;
|
cs |
결과 :
result |
user1^user2^user3 |
위처럼 하나의 row에 구분자를 기준으로 모든 row가 붙어서 출력된다.
* GROUP_CONCAT('데이터' ORDER BY '정렬기준' desc SEPARATOR '구분자') 와 같이 order by 사용도 가능.
* 응용
1
2
3
4
5
6
7
|
SELECT COUNT(*)
FROM sample_table
WHERE json_data REGEXP (
SELECT GROUP_CONCAT(user_id SEPARATOR '|') AS result
FROM user_info
);
|
cs |
적절한 예인지 모르겠으나, 위와 같이 복수개의 문자열에 대한 LIKE 조건을 건 것 처럼 사용 할 수도 있지 않을까..
* jstl 을 사용한 클라이언트단에서의 출력
1
2
3
4
5
6
|
<td>
<c:set var="user_id" value="${fn:split(list.user_id, '^')}" />
<c:forEach var="obj" items="${user_id}" varStatus="idx">
${obj}<c:if test="${!idx.last}"><br></c:if>
</c:forEach>
</td>
|
cs |
※ ORACLE
LISTAGG(column, 'separator') WITHIN GROUP(ORDER BY column)
1
2
|
SELECT LISTAGG(user_id, ',') WITHIN GROUP(ORDER BY user_id) AS result
FROM user_info
|
cs |
반응형
'DB > MYSQL' 카테고리의 다른 글
Mysql hierarchy sql 계층구조 쿼리 : 설계 및 쿼리작성(Multi selectbox) (0) | 2019.08.21 |
---|---|
[Mysql] 시간 계산 : DATE_ADD, DATE_SUB (0) | 2019.08.21 |
SELECT + INSERT (mysql + mybatis) (0) | 2019.06.12 |
mysql GROUP BY (only full group by) (3) | 2019.03.11 |
데이터 형식 바꾸기 : DATE_FORMAT(mysql), TO_DATE(Oracle), CONVERT(sybase) (0) | 2018.12.10 |