CS/SQL

[MySQL] 하나의 글과 연관된 여러 개의 이미지 추출하는 쿼리 작성하기 (feat. GROUP_CONCAT)

2021. 6. 10. 03:17

하나의 글에 연관된 여러 개의 이미지 출력하고 싶을 때가 있다. 인스타그램을 떠올려보면 쉽게 이해가 갈 것이다.

우리가 원하는 데이터의 형태는 게시물(post) 하나에 여러 개의 이미지가 묶여서 하나의 행으로 구성되는 것이다(이때, 이미지는 blob형태가 아닌 varchar로 주소의 형태로 저장된다고 가정한다). 말로 하면 살짝 이상한데, 객체 형태로 표현하자면 다음과 같다.

{ id: 1, content:"글1", paths: [...] } 

어떻게 쿼리를 작성할 수 있을까? 다음과 같은 테이블이 있다고 가정하자.

 

posts 테이블

ID CONTENT
1 글1
2 글2
3 글3

 

images 테이블

ID POST_ID(FK) PATH
1 1 /path1
2 2 /path2
3 2 /path3
4 2 /path4
5 3 /path5
6 3 /path6

 

SELECT와 JOIN으로 전체 데이터를 가져온 후 호스트 프로그램 내에서 처리를 해주거나 SELECT를 두 번해서 post와 image 데이터를 각각 가져온 후 column을 합치는 방법도 있다. 하지만, MySQL에서 제공하는 함수를 이용하면 간단하게 처리할 수 있다.

그 함수는 바로 GROUP_CONCAT이다! GROUP_CONCAT을 사용할 때 주의해야 할 점은 집계 함수이기 때문에 항상 GROUP BY와 함께 써주어야 한다는 것이다.

 

 

>MySQL group_concat() - w3resource

MySQL GROUP_CONCAT() function returns a string with concatenated non-NULL value from a group. Also discussed example on MySQL GROUP_CONCAT() function, GROUP_CONCAT() with order by and example, GROUP_CONCAT() with distinct, GROUP_CONCAT() with separator.

www.w3resource.com

 

 

[MySQL] group_concat 사용방법

MySQL에서 Group_concat을 이용해 그룹별로 데이터를 Concatenate 하는 방법입니다. 간단한 예시를 들면 아래와 같이 [Table 1] '부서 테이블' 이 있을 때 [Table 2] 부서별 성명, [Table 3] 직급별 성명으로 그룹.

mentha2.tistory.com

 

GROUP_CONCAT을 이용하여 작성한 쿼리는 다음과 같다.

SELECT *
FROM posts AS p
INNER JOIN (
	SELECT
	post_id,
	GROUP_CONCAT(path) AS paths
	FROM images
	GROUP BY post_id) AS i
ON (p.id = i.post_id)

images 테이블에서 post_id 별로 그룹을 나눈 후, 그룹에 해당하는 path들을 하나로 합친다(concat). 그 후 posts 테이블과 JOIN을 통해 데이터를 출력한다. 이렇게 해서 하나의 글과 그와 관련된 여러 이미지들을 묶을 수 있다. 최종적으로 split 함수를 이용해 적절하게 나눠서 이미지 경로를 추출하면 된다.

 

별 거 아닌 쿼리지만, 복잡하게 생각하면 한없이 복잡하게 짤 수도 있다(나처럼..). 다른 사람은 나같은 삽질을 하지 않길 바라며 포스팅을 마친다.

 

 

저작자표시 비영리 (새창열림)

'CS > SQL' 카테고리의 다른 글

[SQL] 실행 계획(Execution Plan) 보는 방법  (0) 2023.08.11
[SQLD] SQLD 합격 후기 및 공부 방법  (6) 2021.04.18
[MySQL] Connection Pool을 사용하는 이유  (0) 2021.04.16
[SQLD] Join 연산 정리  (0) 2021.03.18
[MySQL] MySQL에서 CSV파일 Import하기  (5) 2021.02.10
'CS/SQL' 카테고리의 다른 글
  • [SQL] 실행 계획(Execution Plan) 보는 방법
  • [SQLD] SQLD 합격 후기 및 공부 방법
  • [MySQL] Connection Pool을 사용하는 이유
  • [SQLD] Join 연산 정리
코택
코택
코택
TaxFree
코택
전체
오늘
어제
  • 분류 전체보기 (369)
    • Spring (29)
      • Spring (18)
      • 스프링 핵심 원리 - 고급편 (11)
    • Spring Batch (4)
    • JPA (4)
    • CS (89)
      • 자료구조 (2)
      • 네트워크 (5)
      • 운영체제 (1)
      • 데이터베이스 (4)
      • SQL (7)
      • 알고리즘 이론 (4)
      • 알고리즘 문제 풀이 (66)
    • 웹 (28)
      • React.js (4)
      • Next.js (1)
      • Node.js (14)
      • FastAPI (4)
      • Django (5)
    • 프로그래밍 언어 (45)
      • Python (5)
      • Java + Kotlin (29)
      • JavaScript + TypeScript (11)
    • 테스트코드 (26)
      • ATDD, 클린 코드 with Spring (4)
      • 이규원의 현실 세상의 TDD: 안정감을 주는 코드.. (20)
    • 인프라 (6)
      • AWS (2)
      • Kubernetes (4)
    • 트러블슈팅 (25)
    • 책 (89)
      • Effective Java (54)
      • Effective Kotlin (14)
      • 도메인 주도 개발 시작하기: DDD 핵심 개념 정.. (11)
      • 웹 프로그래머를 위한 데이터베이스를 지탱하는 기술 (6)
      • 도메인 주도 설계 첫걸음 (4)
    • Git (10)
    • 회고 (5)
    • etc (8)

블로그 메뉴

  • 홈
  • 방명록
  • 관리
  • GitHub
  • LinkedIn

공지사항

  • 스킨 관련

인기 글

태그

  • BOJ
  • 그래프 탐색
  • 파이썬
  • mysql
  • atdd
  • 장고
  • fastapi
  • dp
  • 백준
  • 그래프
  • 브루트포스
  • Git
  • http
  • 깊이 우선 탐색
  • Shortest Path

최근 댓글

최근 글

hELLO · Designed By 정상우.
코택
[MySQL] 하나의 글과 연관된 여러 개의 이미지 추출하는 쿼리 작성하기 (feat. GROUP_CONCAT)
상단으로

티스토리툴바

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.