안녕하세요.
게시판 테이블에서 필요한 정보들만 뽑아오려고 합니다.
각각의 게시물에 설정된 옵션값들이 별도 게시물 옵션 테이블에 행으로 쌓여있다보니 헤매고있습니다.
-------
# 저장내용
게시글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에 입력된 값이라면 그 값이 무엇이든 불러오려고 합니다.
이러한 점들을 반영해서 작성했을 때 어떤 코드가 될지 다시 한번 여쭈어볼 수 있을까요?
WITH 문은
- 테스트 용도로 사용했을 뿐입니다.
- WITH 문 없다고 생각하시고. Select 구문만 보시면 됩니다.
아 이해했습니다. 초보적인 질문일탠데 친절히 알려주셔서 정말 감사드립니다!