Notice
Recent Posts
Recent Comments
Link
반응형
250x250
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
Tags
- 에너지원
- 송도커낼워크
- 코로나19
- 바이러스
- K 디지털 크레딧
- 부평파스타맛집
- 걷기
- 마라탕맛집
- SementicTags
- 유연성
- 인천맛집
- SementicWeb
- 청라맛집
- 서구맛집
- 아이들이 좋아하는
- 심폐지구력
- 탄수화물
- 근지구력
- 막창맛집
- 조깅
- 심박수
- TypeORM
- HTML
- 달리기
- 다이어트
- 무궁화분식
- 근력
- 시맨틱태그
- 칼국수맛집
- 비전공자개발자이야기
Archives
- Today
- Total
Feel It First
[MySQL] JSON_ARRAYAGG, JSON_OBJECT 본문
728x90
JSON_ARRAYAGG와 JSON_OBJECT
JSON_ARRAYAGG
JSON_ARRAYAGG는 원하는 항목을 JSON ARRAY로 추출한다.
JSON_OBJECT
JSON_OBJECT는 원하는 항목을 JSON OBJECT로 추출한다.
구현하고자 했던 로직
내가 구현하고자 했던 로직은 카테고리에 들어갔을 때 보여지는 리스트에 대한 데이터를 GET 요청이 들어오면 깔끔하게 정리해서 보내주는 것이였다.
Frontend 팀원 요청에 따라 maincategory에 name은 하나의 key값과 value값으로 subcategory와 products는 각각의 key 값 안에 배열에 객체 형태로 데이터를 담아서 보내주기로 하였다.
JSON_ARRAYAGG 안에 JSON_OBJECT를 담아 JSON_OBJECT 안에 key값과 value값을 넣는 방식으로 진행하였는데, 그 과정은 수월했다.
그러나,
error
subcategoryname과 products 2개를 각각의 key값에 담게 하기 위해
JSON_ARRAY를 각각 작성하였는데, 무슨 이유 때문인지 같은 값이 중복해서 여러번 출력되는 상황이 발생했다.
해결하기 위해 했던 조치
- distinct로 중복 데이터를 없애보려 했으나 (실패)
- GROUP BY에 mc.name과 함께 sc.name도 추가 (실패)
문제 해결
SELECT 절에 sub query를 사용해서 각각 하나의 값만 출력될 수 있게 함
최종 코드!
const getProductMainCategories = async (mainCategoryName) => {
const productsMainCategories = await appDataSource.query(`
SELECT
mc.name AS mainCategoryName,
(SELECT
JSON_ARRAYAGG(
JSON_OBJECT('name', sc.name)
)
FROM sub_categories AS sc
JOIN main_categories AS mc ON sc.main_category_id = mc.id
WHERE mc.name = '${mainCategoryName}'
) AS subCategories,
JSON_ARRAYAGG(
JSON_OBJECT(
'locationGroupName', lg.name,
'thumbnailImageUrl', p.thumbnail_image_url,
'name', p.name,
'price', p.price,
'discountRate', p.discount_rate
)
) AS products
FROM products AS p
JOIN sub_categories AS sc ON p.sub_category_id = sc.id
JOIN main_categories AS mc ON sc.main_category_id = mc.id
JOIN location AS l ON p.location_id = l.id
JOIN location_groups AS lg ON l.location_group_id = lg.id
WHERE mc.name = '${mainCategoryName}'
LIMIT 12 OFFSET 0
`);
return productsMainCategories;
}
반응형
'IT' 카테고리의 다른 글
기업협업 회고 (0) | 2023.02.16 |
---|---|
2차 팀 프로젝트 회고 (0) | 2023.02.16 |
첫 팀 프로젝트 회고 - Wedidas (0) | 2023.02.16 |
git branch 작업 순서(feat. merge) (0) | 2023.02.16 |
SQL statements - DDL, DML, DQL이란? (0) | 2023.02.16 |
Comments