RISK IT

[TIL32_23.2.9] [1st-project] 상품 상세페이지 조회 SQL 쿼리문 작성 본문

IT/TIL

[TIL32_23.2.9] [1st-project] 상품 상세페이지 조회 SQL 쿼리문 작성

nomoremystery 2023. 2. 11. 01:09
반응형

작업 내용

제품 상세 페이지에 필요한 정보를 불러오는 쿼리문을 작성했다.
굉장히 많은 테이블의 조합이라서 쉽지 않은 작업이었다.
내가 할 수 있을까 하는 생각도 들고, 머리도 싸매면서 많은 시간을 들여서 작성했다.
그러다 원하는 결과가 마침내 나왔을 때의 쾌감 때문에 개발자를 하는 것 같다.

오늘 작성한 코드 중 제일 긴 쿼리문 하나.

⬇️ 제품 상세 페이지 조회 코드

SELECT
    p.id,
    sub_c.name AS sub_category,
    sub_cat.name AS main_category,
    p.name,
    p.image_url,
    p.description,
    prod_f.feeling_of_use,
    prod_s.scents,
    p.main_ingredient,
    p.ingredient,
    prod_o.options,
    prod_g.guides
FROM products p
INNER JOIN (
        SELECT
            sc.id,
            sc.name
        FROM sub_categories sc
    ) sub_c ON sub_c.id=p.sub_category_id
INNER JOIN (
SELECT
    subc.id,
    mc.name
FROM sub_categories subc
INNER JOIN main_categories mc ON mc.id=subc.main_category_id
) sub_cat ON sub_cat.id = p.sub_category_id
INNER JOIN (
    SELECT
        po.product_id,
        JSON_ARRAYAGG(
            JSON_OBJECT(
                "size", po.size, 
                "price", po.price
            )
        ) AS options
    FROM product_options po
    INNER JOIN products ON products.id = po.product_id
    GROUP BY po.product_id
) prod_o ON p.id=prod_o.product_id
INNER JOIN (
    SELECT
        pps.product_id,
        JSON_ARRAYAGG(ps.scent) AS scents
    FROM products_product_scents pps
    INNER JOIN product_scents ps ON ps.id=pps.product_scent_id
    GROUP BY product_id
) prod_s ON p.id=prod_s.product_id
INNER JOIN (
    SELECT
        ppf.product_id,
        JSON_ARRAYAGG(pf.name) AS feeling_of_use
    FROM products_product_feelings ppf
    INNER JOIN product_feelings pf ON pf.id=ppf.product_feeling_id
    GROUP BY product_id
) prod_f ON p.id=prod_f.product_id
INNER JOIN (
    SELECT
        pg.product_id,
        JSON_ARRAYAGG(
                JSON_OBJECT(
                    "image_url", pg.image_url, 
                    "usage_description", pg.usage_description,
                    "usage_amount", pg.usage_amount, 
                    "texture", pg.texture
                )
            ) AS guides
    FROM product_guides pg
    INNER JOIN products prod ON prod.id=pg.product_id
    GROUP BY product_id
) prod_g ON p.id=prod_g.product_id
WHERE p.id=1;

참 길다..
지금까지는 INNER JOIN을 제대로 활용할 줄 몰라서 FROM에도 이런저런 데이터베이스가 많고 그랬는데, INNER JOIN을 활용하니까 내가 원하는 결과 값만 구할 수 있게 되었다.

이제는 저 쿼리문을 완전히 이해하고 쓸 수 있다는 점이 뿌듯하다~~

반응형