티스토리 뷰

IT

[MySQL] JSON_ARRAYAGG, JSON_OBJECT

csongin 2023. 2. 16. 15:22

목차



    반응형

    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