쿼리 질문 드립니다. 0 9 859

by xcrew mysql [2022.05.25 12:40:08]


아래와 같이 데이터가 있는 테이블이 있습니다.

item_sub_category
sub_category_cd
category_cd
name
14 2 TV
15 2 냉장고
item_options
option_cd
sub_category_cd
name
22 14 사이즈
23 14 종류
item_option_detail
option_detail_cd
option_cd
name
76 22 30미만
77 22 40미만
78 22 50미만
79 22 60미만
80 22 70미만
81 23 스탠드형
82 23 벽걸이형

 

제가 원하는 결과는 아래와 같은 결과를 얻고 싶습니다.

name detail_name
30미만 스탠드형
30미만 벽걸이형
40미만 스탠드형
40미만 벽걸이형
50미만 스탠드형
50미만 벽걸이형
60미만 스탠드형
60미만 벽걸이형
70미만 스탠드형
70미만 벽걸이형

이게 가능 할까요?

도움 부탁드립니다.

 

 

by 마농 [2022.05.25 13:19:34]

조합 가능한 사이즈와 종류를 모두 출력하는 거네요.
그런데. 옵션이 추가되면 어떻게 하나요? 색상이 추가되면 항목이 3개가 될텐데요?
쿼리에서 조회 컬럼의 개수가 가변으로 늘어나지는 않습니다.


by xcrew [2022.05.25 16:38:27]

감사합니다. 마농님 현재 옵션 항목은 최대 2개로만 제한 하였습니다.

그리고 알려주신거 돌려보는데 오류가나서 찾고 있는데 어렵네요 ㅠㅠ

아래와 같은 오류가 납니다...ㅠㅠ

[42000][1064] You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'RECURSIVE t AS ( WITH item_sub_categor' at line 1


by 마농 [2022.05.25 17:13:30]

1. 버전 알려주세요.
2. 조회 조건 있나요?
- 전체 검색인지? TV 만 검색인지?


by xcrew [2022.05.25 17:26:01]

네 버전은 5.7.19-log 입니다.

그리고 TV만 검색입니다!!! 냉장고만 검색도 하구요


by 마농 [2022.05.25 14:25:14]
WITH RECURSIVE t AS
(
WITH item_sub_category(sub_category_cd, category_cd, name) AS
(
SELECT 14 sub_category_cd, 2 category_cd, 'TV' name
UNION ALL SELECT 15, 2, '냉장고'
)
, tem_options AS
(
SELECT 22 option_cd, 14 sub_category_cd, '사이즈' name
UNION ALL SELECT 23, 14, '종류'
UNION ALL SELECT 24, 15, '색상'
UNION ALL SELECT 25, 15, '종류'
UNION ALL SELECT 26, 15, '크기'
)
, item_option_detail AS
(
SELECT 76 option_detail_cd, 22 option_cd, '30미만' name
UNION ALL SELECT 77, 22, '40미만'
UNION ALL SELECT 78, 22, '50미만'
UNION ALL SELECT 79, 22, '60미만'
UNION ALL SELECT 80, 22, '70미만'
UNION ALL SELECT 81, 23, '스탠드형'
UNION ALL SELECT 82, 23, '벽걸이형'
UNION ALL SELECT 83, 24, '빨강'
UNION ALL SELECT 84, 24, '파랑'
UNION ALL SELECT 85, 25, '양문형'
UNION ALL SELECT 86, 25, '단문형'
UNION ALL SELECT 87, 26, '대'
UNION ALL SELECT 88, 26, '중'
UNION ALL SELECT 89, 26, '소'
)
, tmp AS
(
SELECT a.category_cd
     , a.sub_category_cd
     , a.name sub_category_nm
     , c.option_cd
     , b.name option_nm
     , c.option_detail_cd
     , c.name
     , MAX(c.option_cd) OVER(PARTITION BY a.category_cd, a.sub_category_cd) last_option_cd
     , DENSE_RANK() OVER(PARTITION BY a.category_cd, a.sub_category_cd ORDER BY c.option_cd) dr
  FROM item_sub_category a
 INNER JOIN tem_options b
    ON a.sub_category_cd = b.sub_category_cd
 INNER JOIN item_option_detail c
    ON b.option_cd = c.option_cd
-- WHERE a.category_cd = 2
--   AND a.sub_category_cd = 14
)
SELECT category_cd
     , sub_category_cd
     , sub_category_nm
     , last_option_cd
     , dr
     , option_cd
     , option_detail_cd
     , name
     , CAST(option_detail_cd AS VARCHAR(200)) cds
     , CAST(name AS VARCHAR(200)) names
  FROM tmp
 WHERE dr = 1
 UNION ALL
SELECT a.category_cd
     , a.sub_category_cd
     , a.sub_category_nm
     , a.last_option_cd
     , b.dr
     , b.option_cd
     , b.option_detail_cd
     , b.name
     , CONCAT(a.cds, ' - ', b.option_detail_cd) cds
     , CONCAT(a.names, ' - ', b.name) names
  FROM t a
 INNER JOIN tmp b
    ON a.category_cd = b.category_cd
	AND a.sub_category_cd = b.sub_category_cd
	AND b.dr = a.dr + 1
)
SELECT sub_category_cd
     , sub_category_nm
     , names
  FROM t
 WHERE option_cd = last_option_cd
 ORDER BY category_cd, sub_category_cd, cds
;

 


by 마농 [2022.05.25 17:46:12]
/* -- Test 용 --
WITH item_sub_category(sub_category_cd, category_cd, name) AS
(
SELECT 14 sub_category_cd, 2 category_cd, 'TV' name
UNION ALL SELECT 15, 2, '냉장고'
)
, tem_options AS
(
SELECT 22 option_cd, 14 sub_category_cd, '사이즈' name
UNION ALL SELECT 23, 14, '종류'
UNION ALL SELECT 24, 15, '색상'
UNION ALL SELECT 25, 15, '종류'
)
, item_option_detail AS
(
SELECT 76 option_detail_cd, 22 option_cd, '30미만' name
UNION ALL SELECT 77, 22, '40미만'
UNION ALL SELECT 78, 22, '50미만'
UNION ALL SELECT 79, 22, '60미만'
UNION ALL SELECT 80, 22, '70미만'
UNION ALL SELECT 81, 23, '스탠드형'
UNION ALL SELECT 82, 23, '벽걸이형'
UNION ALL SELECT 83, 24, '빨강'
UNION ALL SELECT 84, 24, '파랑'
UNION ALL SELECT 85, 25, '양문형'
UNION ALL SELECT 86, 25, '단문형'
)
*/
SELECT a.name
     , b.name name_1
     , c.name name_2
  FROM (SELECT a.name
             , MIN(b.option_cd) option_cd_1
             , MAX(b.option_cd) option_cd_2
          FROM item_sub_category a
         INNER JOIN tem_options  b
            ON a.sub_category_cd = b.sub_category_cd
         WHERE a.sub_category_cd = 14    -- TV
--         WHERE a.sub_category_cd = 15    -- 냉장고
         GROUP BY a.name
        ) a
 INNER JOIN item_option_detail b ON a.option_cd_1 = b.option_cd
 INNER JOIN item_option_detail c ON a.option_cd_2 = c.option_cd
 ORDER BY b.option_detail_cd, c.option_detail_cd
;

 


by xcrew [2022.05.26 08:48:55]

정말 감사합니다. 마농님~!!!!

제가 테스트로 돌려 보았는데요.  옵션이 한개일 수도 있어서요......

옵션 두개일때는 제가 원하던 결과 입니다!

냉장고의 아래와 같이 옵션 한개면 어떻게 해야하나요........정말 죄송합니다 ㅠㅠ

, tem_options AS
 (
     SELECT 22 option_cd, 14 sub_category_cd, '사이즈' name
     UNION ALL SELECT 23, 14, '종류'
     UNION ALL SELECT 25, 15, '종류'
 )

 

 


by 마농 [2022.05.26 09:16:41]
WITH item_sub_category(sub_category_cd, category_cd, name) AS
(
SELECT 14 sub_category_cd, 2 category_cd, 'TV' name
UNION ALL SELECT 15, 2, '냉장고'
)
, tem_options AS
(
SELECT 22 option_cd, 14 sub_category_cd, '사이즈' name
UNION ALL SELECT 23, 14, '종류'
UNION ALL SELECT 24, 15, '색상'
-- UNION ALL SELECT 25, 15, '종류'
)
, item_option_detail AS
(
SELECT 76 option_detail_cd, 22 option_cd, '30미만' name
UNION ALL SELECT 77, 22, '40미만'
UNION ALL SELECT 78, 22, '50미만'
UNION ALL SELECT 79, 22, '60미만'
UNION ALL SELECT 80, 22, '70미만'
UNION ALL SELECT 81, 23, '스탠드형'
UNION ALL SELECT 82, 23, '벽걸이형'
UNION ALL SELECT 83, 24, '빨강'
UNION ALL SELECT 84, 24, '파랑'
-- UNION ALL SELECT 85, 25, '양문형'
-- UNION ALL SELECT 86, 25, '단문형'
)
SELECT a.name
     , b.name name_1
     , c.name name_2
  FROM (SELECT a.name
             , MIN(b.option_cd) option_cd_1
             , NULLIF(MAX(b.option_cd), MIN(b.option_cd)) option_cd_2  -- 요기
          FROM item_sub_category a
         INNER JOIN tem_options  b
            ON a.sub_category_cd = b.sub_category_cd
--         WHERE a.sub_category_cd = 14    -- TV
         WHERE a.sub_category_cd = 15    -- 냉장고
         GROUP BY a.name
        ) a
 INNER JOIN item_option_detail b ON a.option_cd_1 = b.option_cd
  LEFT JOIN item_option_detail c ON a.option_cd_2 = c.option_cd        -- 요기
 ORDER BY b.option_detail_cd, c.option_detail_cd
;

 


by xcrew [2022.05.26 11:38:31]

정말 감사합니다~!

그저 빛!!!!!!!

댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입