안녕하세요.
게시판 테이블에서 필요한 정보들만 뽑아오려고 합니다.
각각의 게시물에 설정된 옵션값들이 별도 게시물 옵션 테이블에 행으로 쌓여있다보니 헤매고있습니다.
-------
# 저장내용
게시글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')
---------------------
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 로 집계해 주시면 됩니다.
답변 감사드립니다
그런데 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에 입력된 값이라면 그 값이 무엇이든 불러오려고 합니다.
이러한 점들을 반영해서 작성했을 때 어떤 코드가 될지 다시 한번 여쭈어볼 수 있을까요?