반응형
비슷한 구조를 가진 Table이 이름만 다른채로 여러개로 퍼져서 운영되는 경우,
join, union을 사용해서 데이터를 추출하려고 해도, Table이 많아지면 결국 노가다가 된다.
이런 경우 GROUP_CONCAT을 이용하면 유용하다.
# 결과 쿼리가 들어갈 변수 선언 SET @resultQuery = NULL; # GROUP_CONCAT으로 쿼리 문자열에 쿼리문을 생성하여 등록 SELECT GROUP_CONCAT( DISTINCT // 문자열이 중복된 경우 제거해주는 옵션인 듯) CONCAT('(select 컬렴명1, 컬럼명2 from ', table_name, ' limit 1)') SEPARATOR '\r\nUNION\r\n' // 각 쿼리를 뭘로 연결할 것인지 (센스있게 마지막쿼리엔 붙지 않음) ) INTO @resultQuery FROM information_schema.TABLES WHERE table_name LIKE '테이블명%'; // 본인의 경우 prefix가 같아서 이렇게 사용 # 문자열로 쿼리가 등록된 상황이므로, prepare statement를 이용하여 실행해준다. (select로 하게되면, 문자열 자체가 결과로 나오게됨) PREPARE stmt FROM @resultQuery; EXECUTE stmt; DEALLOCATE PREPARE stmt;
이슈1) UNION 문과 limit문을 같이 사용하는 경우, 쿼리에 괄호가 누락되면 제대로 동작을 하지 않는다. 각 쿼리에 limit문이 들어간다면, 괄호문을 꼭 넣어주도록 하자.
이슈2) 아마 쿼리문이 1024 byte를 넘어가면, 짤리는 현상이 생겨서 실행이 제대로 되지 않을 것이다.
이런 경우 아래 명령어로 group_concat의 최대 사이즈를 늘려주자. (varchar니깐 65535까지 되는 것 같음)
SET SESSION group_concat_max_len = 65535;
DBA에게 위에 요구사항을 만족하는 쿼리 요구를 했더니, 엑셀을 열더니 노가다 방법을 알려주시더군.. 뭐 그럴수있지;
반응형
'개발 > Database' 카테고리의 다른 글
[Mysql] 5.5 패키지 설치 (CentOS 6.5) (0) | 2016.06.10 |
---|---|
[Mysql] phpMyAdmin 여러대의 Mysql 서버관리 (0) | 2016.06.10 |
[Mysql] local-infile (0) | 2016.06.10 |
[MongoDB] 기본 세팅 + ReplicaSet 구성 및 Arbiter (0) | 2016.06.10 |
[MongoDB] Log Rotate (0) | 2016.06.10 |