본문 바로가기
MySQL Workbench

[MySQL] 문자열 데이터를 합쳐서 컬럼 데이터로 가져오는 sql문 _ group_concat

by 처카푸 2024. 7. 12.

문자열 데이터를 합쳐서 컬럼 데이터로 가져오는 sql문

 

api를 만들던 중

각각의 고유 인덱스를 가지고 있는 데이터를 모두 다 합쳐서 한 개의 새로운 컬럼 데이터로 만들고 싶었다.

 

원래 sql 문

-- 주문 상세 정보 가져오기
select o.status, o.orderNumber, o.createdAt, u.userName, u.phone, o.address, p.packagingType, flowerName,
		o.reservationDate, o.comment, o.paymentMethod, o.totalPrice, o.receive
from orders o
join user u
	on o.userId = u.id
join cart c
	on o.cartId = c.cartId
join package p
	on c.packageId = p.packageId
join size s
	on c.sizeId = s.sizeId
join addFlower af
	on o.cartId = af.cartId
join flower f
	on af.flowerId =  f.id
where o.orderId = 43 and o.userId = 17;

- 중복으로 데이터를 다 가져온다.

 

 

변경한 sql문

- group_concat 사용

- separator 사용

-- 주문 상세 정보 가져오기
select o.status, o.orderNumber, o.createdAt, u.userName, u.phone, o.address, p.packagingType, 
		group_concat(
							distinct f.flowerName 
							order by f.flowerName 
							asc separator ',') as orderFlower,
		o.reservationDate, o.comment, o.paymentMethod, o.totalPrice, o.receive
from orders o
join user u
	on o.userId = u.id
join cart c
	on o.cartId = c.cartId
join package p
	on c.packageId = p.packageId
join size s
	on c.sizeId = s.sizeId
join addFlower af
	on o.cartId = af.cartId
join flower f
	on af.flowerId =  f.id
where o.orderId = 43 and o.userId = 17;-- 주문 상세 정보 가져오기
select o.orderId, o.createdAt, o.status, p.packagingType, 
		group_concat(
									distinct f.flowerName 
									order by o.orderId
									asc separator ',') as orderFlower,
		c.quantity, s.sizeType, o.totalPrice, o.receive,
        case
        when group_concat(
						distinct f.flowerName 
						order by f.flowerName 
						asc separator ',') = '근조화환' then p.secondPackagePhotoUrl
        else p.firstPackagePhotoUrl
        end as packageUrl
from orders o
join user u
	on o.userId = u.id
join cart c
	on o.cartId = c.cartId
join package p
	on c.packageId = p.packageId
join size s
	on c.sizeId = s.sizeId
join addFlower af
	on o.cartId = af.cartId
join flower f
	on af.flowerId =  f.id
where o.userId = 17
group by o.orderId
order by o.createdAt desc;

 

- 꽃이름을 한 번에 가져온다.