๋ชฉ์ฐจ

GROUP_CONCAT() ๊ฐ๋จ ์ฌ์ฉ๋ฒ ๐
์ญ์๋ ๋ฏธ๋์ ๋ด๊ฐ ๋ณด๊ธฐ์ํด ๊ธฐ๋กํจ
์ ๋ฌด๋ฅผ ํ๋ค๋ณด๋ฉด ํน์ ํ๋๊ฐ์ ์๋์ฒ๋ผ ๊ฐ๋ก๋ก ๋ถ์ฌ์ ๋ณด์ฌ์ค์ผ ๋๋ ๊ฒฝ์ฐ๋ ์๋ค.
๋ฐ์ดํฐ๋ฅผ ํด๋ผ์ด์ธํธ์ ๋ฐํ ์ ์ฟผ๋ฆฌ 2๋ฒ ๋ ๋ฆด ๊ฑธ 1๋ฒ ๋ ๋ฆฌ๋๊ฒ ์ข๊ธฐ ๋๋ฌธ์ ์๋์ฒ๋ผ ๋ถ์ด๋ ๋ฐฉ๋ฒ๋ ์๋ค.

์๋ฅผ ๋ค์ด SNS ์๋น์ค์์ ์ต์ข ์ ์ผ๋ก ๋ฐํํด์ผ๋๋ ๋ฐ์ดํฐ๊ฐ ํ์ ์ ๋ณด + ํ์ ๋ฑ๋กํ ํด์ํ๊ทธ ๋ชฉ๋ก์ด๋ผ๊ณ ๊ฐ์ ์ ํด๋ณด๋ฉด ๋๋ต ์๋์ ๊ฐ์ ๋ฐ์ดํฐ๊ฐ ๋ฐํ๋์ผ ๋ ๊ฒ์ด๋ค.
ํ์์ผ๋ จ๋ฒํธ, ํ์์์ด๋, ํ์์ด๋ฆ, ํ์์ด๋ฉ์ผ, ๊ธฐํ ํ์ ์ ๋ณด, ๊ทธ๋ฆฌ๊ณ ํด์ํ๊ทธ
DB ํ ์ด๋ธ ๊ตฌ์กฐ ๐
DB ํ ์ด๋ธ์ ์๋์ ๊ฐ๋ค.
๋์ผํ ํ ์คํธ๋ฅผ ํ ์ ์๋๋ก ์คํฌ๋ฆฝํธ๋ ์ฒจ๋ถํ๋ค.
script(DDL)
-- ํ์ ํ
์ด๋ธ
CREATE TABLE `member_220815_test` (
`mem_no` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '์ผ๋ จ๋ฒํธ',
`mem_id` varchar(200) NOT NULL DEFAULT '' COMMENT 'ํ์ ์์ด๋',
`password` varchar(100) NOT NULL COMMENT '๋น๋ฐ๋ฒํธ',
PRIMARY KEY (`mem_no`)
) ENGINE=InnoDB AUTO_INCREMENT=480 DEFAULT CHARSET=utf8mb4 COMMENT='ํ์'
-- ๋งคํ ํ
์ด๋ธ
CREATE TABLE `member_220815_tag_220815_mapping` (
`mem_no` bigint(20) unsigned NOT NULL,
`tag_no` bigint(20) unsigned NOT NULL,
PRIMARY KEY (`mem_no`,`tag_no`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='ํ์_ํ๊ทธ_๋งคํ'
-- ํด์ํ๊ทธ ํ
์ด๋ธ
CREATE TABLE `tag_220815_test` (
`tag_no` bigint(20) NOT NULL,
`tag_name` varchar(50) DEFAULT NULL,
PRIMARY KEY (`tag_no`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='ํด์ํ๊ทธ'
script(DML)
-- ํ์ ํ
์ด๋ธ ํ
์คํธ ๋ฐ์ดํฐ
INSERT INTO member_220815_test
(mem_no, mem_id, password)
VALUES(5, 'test@gmail.com', 'bcb15f821479b4d5772bd0ca866c00ad5f926e3580720659cc80d39c9d09802a');
INSERT INTO member_220815_test
(mem_no, mem_id, password)
VALUES(10, 'test', 'bcb15f821479b4d5772bd0ca866c00ad5f926e3580720659cc80d39c9d09802a');
INSERT INTO member_220815_test
(mem_no, mem_id, password)
VALUES(11, 'test1', 'bcb15f821479b4d5772bd0ca866c00ad5f926e3580720659cc80d39c9d09802a');
INSERT INTO member_220815_test
(mem_no, mem_id, password)
VALUES(147, 'test4@naver.com', 'bcb15f821479b4d5772bd0ca866c00ad5f926e3580720659cc80d39c9d09802a');
INSERT INTO member_220815_test
(mem_no, mem_id, password)
VALUES(154, 'testasdf@naver.com', 'bcb15f821479b4d5772bd0ca866c00ad5f926e3580720659cc80d39c9d09802a');
INSERT INTO member_220815_test
(mem_no, mem_id, password)
VALUES(186, 'test1234@naver.com', 'bcb15f821479b4d5772bd0ca866c00ad5f926e3580720659cc80d39c9d09802a');
INSERT INTO member_220815_test
(mem_no, mem_id, password)
VALUES(197, 'test523@naver.com', 'bcb15f821479b4d5772bd0ca866c00ad5f926e3580720659cc80d39c9d09802a');
INSERT INTO member_220815_test
(mem_no, mem_id, password)
VALUES(271, 'test5@naver.com', 'bcb15f821479b4d5772bd0ca866c00ad5f926e3580720659cc80d39c9d09802a');
INSERT INTO member_220815_test
(mem_no, mem_id, password)
VALUES(459, 'test11111@naver.com', 'bcb15f821479b4d5772bd0ca866c00ad5f926e3580720659cc80d39c9d09802a');
-- ๋งคํ ํ
์ด๋ธ ํ
์คํธ ๋ฐ์ดํฐ
INSERT INTO member_220815_tag_220815_mapping
(mem_no, tag_no)
VALUES(5, 1);
INSERT INTO member_220815_tag_220815_mapping
(mem_no, tag_no)
VALUES(5, 2);
INSERT INTO member_220815_tag_220815_mapping
(mem_no, tag_no)
VALUES(5, 3);
INSERT INTO member_220815_tag_220815_mapping
(mem_no, tag_no)
VALUES(5, 4);
INSERT INTO member_220815_tag_220815_mapping
(mem_no, tag_no)
VALUES(10, 2);
INSERT INTO member_220815_tag_220815_mapping
(mem_no, tag_no)
VALUES(10, 5);
INSERT INTO member_220815_tag_220815_mapping
(mem_no, tag_no)
VALUES(10, 6);
INSERT INTO member_220815_tag_220815_mapping
(mem_no, tag_no)
VALUES(10, 7);
INSERT INTO member_220815_tag_220815_mapping
(mem_no, tag_no)
VALUES(10, 8);
INSERT INTO member_220815_tag_220815_mapping
(mem_no, tag_no)
VALUES(11, 3);
INSERT INTO member_220815_tag_220815_mapping
(mem_no, tag_no)
VALUES(147, 4);
INSERT INTO member_220815_tag_220815_mapping
(mem_no, tag_no)
VALUES(154, 5);
INSERT INTO member_220815_tag_220815_mapping
(mem_no, tag_no)
VALUES(186, 6);
INSERT INTO member_220815_tag_220815_mapping
(mem_no, tag_no)
VALUES(197, 7);
INSERT INTO member_220815_tag_220815_mapping
(mem_no, tag_no)
VALUES(271, 8);
INSERT INTO member_220815_tag_220815_mapping
(mem_no, tag_no)
VALUES(459, 9);
-- ํด์ํ๊ทธ ํ
์ด๋ธ ํ
์คํธ ๋ฐ์ดํฐ
INSERT INTO tag_220815_test
(tag_no, tag_name)
VALUES(1, '์ฌํ
ํฌ');
INSERT INTO tag_220815_test
(tag_no, tag_name)
VALUES(2, '๊ฑด๊ฐ');
INSERT INTO tag_220815_test
(tag_no, tag_name)
VALUES(3, '์ง ํ
ํฌ');
INSERT INTO tag_220815_test
(tag_no, tag_name)
VALUES(4, '์ํํ');
INSERT INTO tag_220815_test
(tag_no, tag_name)
VALUES(5, '์๋ก');
INSERT INTO tag_220815_test
(tag_no, tag_name)
VALUES(6, 'ํ๊ฒฝ');
INSERT INTO tag_220815_test
(tag_no, tag_name)
VALUES(7, '์นดํ');
INSERT INTO tag_220815_test
(tag_no, tag_name)
VALUES(8, '๋ง์ง');
INSERT INTO tag_220815_test
(tag_no, tag_name)
VALUES(9, '์ฃผ์');

member ํ ์ด๋ธ๊ณผ tag_name์ N:M๊ด๊ณ ์ด๋ฏ๋ก ์ค๊ฐ์ ๋งคํ ํ ์ด๋ธ์ ํ๋ ๋๊ณ ๋งคํ ํ ์ด๋ธ์ ๊ฐ๊ฐ ํ ์ด๋ธ์ pk(mem_no, tag_no)๋ฅผ ๋ณตํฉํค๋ก ๊ฐ์ง๊ณ memberํ ์ด๋ธ๊ณผ tag_name ํ ์ด๋ธ์์ ์ด๋ฅผ ์ฐธ์กฐํด์ ์กฐํํ๊ณ ๋งคํ ํ ์ด๋ธ์๋ ์ค๋ณต๊ฐ์ด ์๋ค.(ํ์ ํ๋ช ์ด ์ฌ๋ฌ๊ฐ์ ํด์ํ๊ทธ๋ฅผ ๋ฑ๋กํ ๊ฒฝ์ฐ)
์ด ๊ฒฝ์ฐ member ํ ์ด๋ธ์ ๊ธฐ์ค์ผ๋ก ๋จ์ํ๊ฒ ์กฐ์ธ์ ํ ๊ฒฝ์ฐ ์๋์ฒ๋ผ 5๋ฒ๊ณผ 10๋ฒ ํ์์ ์ค๋ณต๋ฐ์ดํฐ๊ฐ ๋์จ๋ค.(๋งคํ ํ ์ด๋ธ์ 5๋ฒ๊ณผ 10๋ฒ์ด ์ค๋ณต์ด๊ธฐ์)

ํ์ ํ๋ช ์ ๋ํด์ ํด์ํ๊ทธ๊ฐ ์ฌ๋ฌ๊ฐ์ธ ๊ฒฝ์ฐ ์๋์ฒ๋ผ ํ์๋ฅผ ํ๊ณ ์ถ๋ค.

GROUP_CONCAT()์ ์ด์ฉํ SQL ๐คฉ
์ด ๊ฒฝ์ฐ ์๋์ฒ๋ผ ์ฟผ๋ฆฌ๋ฅผ ์ง์ํ๋ฉด ๋๋ค.(ํ์ ํ ์ด๋ธ์ ๊ธฐ์ค์ผ๋ก ๋งคํ ํ ์ด๋ธ์ ์ด์ฉํด์ ํ๊ทธ๋ช ์กฐํํ๋ GROUP_CONCAT()์ผ๋ก ๋ฌธ์์ด์ ๋ถ์ฌ์ ์กฐํ)
select a.*,
GROUP_CONCAT(c.tag_name) tag_name
from member_220815_test a left outer join member_220815_tag_220815_mapping b on a.mem_no = b.mem_no
left outer join tag_220815_test c on b.tag_no = c.tag_no
-- ํ
์คํธ๋ง ์กฐํ(ํ
์คํธ ํ๊ฒฝ์์ ๊ธฐ์กด์ memberํ
์ด๋ธ์ ๋ณต์ฌํด์์ ์ค๋ฐ์ดํฐ๋ ์๊ธฐ์ ์ ์ธํจ)
where a.mem_id LIKE 'test%'
group by a.mem_no
;
GROUP_CONCAT() ์ฌ์ฉ ์ ์๋์ฒ๋ผ ํ๋์ ๊ฐ์ ํ์ค๋ก ๋ถ์ฌ์ ๋ณด์ฌ์ค๋ค.

๋ฌธ์์ด์ ๋ถ์ผ ํ๋๋ฅผ ๋จ์ํ๊ฒ GROUP_CONCAT()์ผ๋ก ์คํ ์ ์๋์ฒ๋ผ GROUP_CONCATํ ํ๋์ ๋ชจ๋ ๋ฐ์ดํฐ๊ฐ ํ์ค๋ก ๋ถ์ด์ ๋์จ๋ค.

์ด ๋ GROUP BY๋ฅผ ์ํ๋ ํ๋๋ก ํด์ฃผ๋ฉด ์๋์ฒ๋ผ ๋์จ๋ค.


๋๊ธ