연관된 두 테이블을 합쳐서 출력하는 방법 질문 드립니다. 0 4 779

by 크흑흑 [SQL Query] mariadb query [2022.08.23 22:34:05]


안녕하세요. 

게시판 테이블에서 필요한 정보들만 뽑아오려고 합니다.

각각의 게시물에 설정된 옵션값들이 별도 게시물 옵션 테이블에 행으로 쌓여있다보니 헤매고있습니다.

-------

# 저장내용

게시글1에는 옵션A에 A-A, 옵션B에 B-A라는 값을 저장함.

게시글2에는 옵션B에 A-B, 옵션B에 B-B라는 값을 저장함.

 

#콘텐츠 테이블

uid title content
1 게시글1 게시글1 내용
2 게시글2 게시글2 내용
     

 

# 옵션 테이블 ( 이 테이블의 content_uid 컬럼 값은 상단 콘텐츠 테이블의 uid를 가리킵니다 )

uid content_uid opt_key opt_value
1 1 optionA A-A
2 1 optionB B-A
3 2 optionA A-B
4 2 optionB B-B

 

# 위 두 테이블로 원하는 출력

제목 내용 optionA optionB
게시글1 게시글1 내용 A-A B-A
게시글2 게시글2 내용 A-B B-B

 

# 시도 결과

제목 내용 optionA optionB
게시글1 게시글1 내용 A-A  
게시글1 게시글1 내용   B-A
게시글2 게시글2 내용 A-B  
게시글2 게시글2 내용   B-B

----------------------

# 시도한 쿼리문

SELECT `콘텐츠테이블`.`title`,
       `콘텐츠테이블`.`content`,
       CASE
           WHEN `옵션테이블(별칭)`.`option_key` = 'optionA'
               THEN `옵션테이블(별칭)`.`opt_value`
           END AS optionA,
       CASE
           WHEN `옵션테이블(별칭)`.`option_key` = 'optionB'
               THEN `옵션테이블(별칭)`.`opt_value`
           END AS optionB
FROM `콘텐츠테이블`
         INNER JOIN `옵션테이블` AS `옵션테이블(별칭)`
                    ON `콘텐츠테이블`.`uid` = `옵션테이블(별칭)`.`content_uid`

WHERE (`옵션테이블(별칭)`.`option_key` = 'optionA'
            OR `옵션테이블(별칭)`.`option_key` = 'optionB')

---------------------

by 마농 [2022.08.23 23:49:56]
WITH 콘텐츠테이블 AS
(
SELECT 1 uid, '게시글1'title, '게시글1 내용' content
UNION ALL SELECT 2, '게시글2', '게시글2 내용'
)
, 옵션테이블 AS
(
SELECT 1 uid, 1 content_uid, 'optionA' opt_key, 'A-A' opt_value
UNION ALL SELECT 2, 1, 'optionB', 'B-A'
UNION ALL SELECT 3, 2, 'optionA', 'A-B'
UNION ALL SELECT 4, 2, 'optionB', 'B-B'
)
SELECT a.title
     , a.content
     , MIN(CASE b.opt_key WHEN 'optionA' THEN b.opt_value END) optionA
     , MIN(CASE b.opt_key WHEN 'optionB' THEN b.opt_value END) optionB
  FROM 콘텐츠테이블 a
 INNER JOIN 옵션테이블 b
    ON a.uid = b.content_uid
 WHERE b.opt_key IN ('optionA', 'optionB')
 GROUP BY a.uid, a.title, a.content
;

`따옴표` 하나 하나 다 붙이면 쿼리 작성도 힘들고 보기에도 불편합니다.
테이블명은 간결한 알리아스로 바꿔주는게 보기에도 좋고, 쿼리 작성하기도 편합니다.
2줄로 나오는 걸 한줄로 나오게 하려면 GROUUP BY 로 집계해 주시면 됩니다.


by 크흑흑 [2022.08.24 13:35:57]

답변 감사드립니다
그런데 mariadb 10.0.x 버전을 사용중이라 그런지 WITH AS 구문이 안되는 것 같습니다
그리고 옵션 테이블의 opt_value 컬럼의 값(A-A, A-B, B-A, B-B 등)은 게시물마다 그 값을 예상할 수 없는 임의의 값 들이 담깁니다. 게시물의 제목(title)과 내용(content)도 예상할 수 없는 임의의 값이 들어갑니다. 
알려주신 코드를 아직 한줄한줄 의미를 찾아 보고 있지만, 혹시 쿼리문 중간에  '게시글1', 'A-A' opt_value 와 같이 입력된 것은 동일한 문자의 값으로만 검색이 되는 것은 아닌가하는 생각이 들었습니다. 게시물 제목, 내용, optionA, optionB에 입력된 값이라면 그 값이 무엇이든 불러오려고 합니다. 

이러한 점들을 반영해서 작성했을 때 어떤 코드가 될지 다시 한번 여쭈어볼 수 있을까요? 


by 마농 [2022.08.24 14:36:55]

WITH 문은
 - 테스트 용도로 사용했을 뿐입니다.
 - WITH 문 없다고 생각하시고. Select 구문만 보시면 됩니다.


by 크흑흑 [2022.08.24 15:36:15]

아 이해했습니다. 초보적인 질문일탠데 친절히 알려주셔서 정말 감사드립니다! 

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