테이블 만들기
1 테이블 생성
CREATE TABLE `new_table` (
`CODE` int NOT NULL AUTO_INCREMENT,
`UP_CODE` int DEFAULT NULL,
`GROUP_ORD` int DEFAULT NULL,
`GROUP_LAYER` int DEFAULT NULL,
`TITLE` varchar(250) DEFAULT NULL,
`CONTENT` longtext,
`WRITER` varchar(50) DEFAULT NULL,
`REG_DATETIME` datetime DEFAULT CURRENT_TIMESTAMP,
`GROUP_ID` int DEFAULT NULL,
PRIMARY KEY (`CODE`)
) ENGINE=InnoDB AUTO_INCREMENT=54 DEFAULT CHARSET=utf8mb3 COMMENT='게시글 테스트';
2 컬럼 설명
CODE | 게시글 고유 번호 |
UP_CODE | 부모 게시글 번호 |
GROUP_ORD | 그룹 내 순서 |
GROUP_LAYER | 그룹 계층 |
TITLE | 제목 |
CONTENT | 내용 |
WRITER | 작성자 |
GROUP_ID | 그룹 아이디 |
REG_DATETIME | 작성일 |
원글을 등록하는 경우
1 원글 등록
- GROUP_ORD : 0
- GROUP_LAYER : 0
- TITLE, CONTENT,WRITER
INSERT INTO `test2`.`new_table`
(`GROUP_ORD`,
`GROUP_LAYER`,
`TITLE`,
`CONTENT`,
`WRITER`)
VALUES
(
0,
0,
'게시글 1 테스트',
'게시글 1 테스트',
'게시글 1 작성자'
);
2 원글 수정
- GROUP_ID : 1 에서 INSERT 한 게시글의 CODE 값과 같게 수정
- UP_CODE : 1 에서 INSERT 한 게시글의 CODE 값과 같게 수정
UPDATE `test2`.`new_table`
SET
`UP_CODE` = 55,
GROUP_ID = 55
WHERE `CODE` = 55;
3 원글 등록 결과 확인
답글을 등록하는 경우
1 원글에 대한 답글인지 답글에 대한 답글인지 먼저 확인
- GROUP_ID 와 CODE가 같으면 원글에 대한 답글등록
- GROUP_ID 와 CODE가 다르면 답글에 대한 답글 등록
SELECT GROUP_ID FROM NEW_TABLE
WHERE CODE = 55;
2 원글에 대한 답글인 경우 (1의 GROUP_ID와 CODE가 같은 경우)
2.1 답글 등록에 필요한 데이터 먼저 가져오기
- UP_CODE가 원글 CODE인 게시글 들 중 최대 GROUP_ORD 추출
- 원글의 GROUP_LAYER 추출
-- UP_CODE가 원글 CODE인 게시글 들 중 최대 GROUP_ORD 추출
SELECT MAX(GROUP_ORD) FROM NEW_TABLE
WHERE UP_CODE = 55;
-- 원글의 GROUP_LAYER 추출
SELECT GROUP_LAYER FROM NEW_TABLE
WHERE CODE = 55;
-- 원글의 GROUP_ID 추출
SELECT GROUP_ID FROM NEW_TABLE
WHERE CODE = 55;
2.2 답글 등록
- UP_CODE : 원글의 CODE
- GROUP_ORD : 2.1에서 찾은 GROUP_ORD + 1
- GROUP_LAYER : 2.1에서 찾은 GROUP_LAYER + 1
- GROUP_ID : 원글의 GROUP_ID
INSERT INTO NEW_TABLE
(`UP_CODE`,
GROUP_ID,
`GROUP_ORD`,
`GROUP_LAYER`,
`TITLE`,
`CONTENT`,
`WRITER`)
VALUES
(55,
55,
1,
1,
'[RE] 게시글 1 테스트',
'[RE] 게시글 1 테스트',
'얼룩말');
2.3 답글 등록 결과 확인
3 답글에 대한 답글인 경우 (1의 GROUP_ID와 CODE가 다른 경우)
3.1 답글에 대한 답글이 처음인지, 처음이 아닌지 확인
- count가 0 이면 답글에 대한 답글이 처음 달리는 것
- count가 0이 아니면 답글에대한 답글이 이미 N개 달려 있는 것
SELECT COUNT(*)
FROM NEW_TABLE
WHERE UP_CODE = 56;
3.2 답글에 대한 답글의 답글을 처음 등록 하는 경우 (3.1의 count가 0인 경우)
3.2.1 답글에 대한 답글 등록에 필요한 데이터 먼저 가져오기
- 원글의 GROUP_LAYER 추출
- 원글의 GROUP_ORD 추출
- 원글의 GROUP_ID 추출
-- 원글의 GROUP_LAYER 추출
SELECT GROUP_LAYER
FROM NEW_TABLE
WHERE CODE =56;
-- 원글의 GROUP_ORD 추출
SELECT GROUP_ORD
FROM NEW_TABLE
WHERE CODE = 56;
-- 원글의 GROUP_ID 추출
SELECT GROUP_ID
FROM NEW_TABLE
WHERE CODE = 56;
3.2.2 답글에 대한 답글 등록
- UP_CODE : 원글의 CODE
- GROUP_ORD : 3.2.1에서 찾은 GROUP_ORD
- GROUP_LAYER : 3.2.1에서 찾은 GROUP_LAYER + 1
- GROUP_ID : 원글의 GROUP_ID
INSERT INTO NEW_TABLE
(`UP_CODE`,
GROUP_ID,
`GROUP_ORD`,
`GROUP_LAYER`,
`TITLE`,
`CONTENT`,
`WRITER`)
VALUES
(56,
55,
1,
2,
'[RE] [RE] 게시글 1 테스트',
'[RE] [RE] 게시글 1 테스트',
'얼룩말');
3.2.3 답글에 대한 답글 등록 결과 확인
3.3 답글에 대한 답글의 답글을 N번째 등록 하는 경우 (3.1의 count가 0이 아닌 경우)
3.3.1 답글에 대한 답글 등록에 필요한 데이터 먼저 가져오기
- 원글의 GROUP_LAYER 추출
- UP_CODE가 원글 CODE인 게시글 들 중 최대 GROUP_ORD 추출
- 원글의 GROUP_ID 추출
-- UP_CODE가 원글 CODE인 게시글 들 중 최대 GROUP_ORD 추출
SELECT MAX(GROUP_ORD) FROM NEW_TABLE
WHERE UP_CODE = 56;
-- 원글의 GROUP_LAYER 추출
SELECT GROUP_LAYER FROM NEW_TABLE
WHERE CODE = 56;
-- 원글의 GROUP_ID 추출
SELECT GROUP_ID FROM NEW_TABLE
WHERE CODE = 56;
3.3.2 답글에 대한 답글 등록
- UP_CODE : 원글의 CODE
- GROUP_ORD : 3.2.1에서 찾은 GROUP_ORD
- GROUP_LAYER : 3.2.1에서 찾은 GROUP_LAYER + 1
- GROUP_ID : 원글의 GROUP_ID
INSERT INTO NEW_TABLE
(`UP_CODE`,
GROUP_ID,
`GROUP_ORD`,
`GROUP_LAYER`,
`TITLE`,
`CONTENT`,
`WRITER`)
VALUES
(56,
55,
1,
2,
'[RE] [RE] 게시글 1 테스트2',
'[RE] [RE] 게시글 1 테스트2',
'얼룩말');
3.3.3 답글에 대한 답글 등록 결과 확인
조회
1. select query 작성
SELECT * FROM NEW_TABLE
ORDER BY
GROUP_ID DESC,
GROUP_ORD ASC,
UP_CODE ASC,
CODE ;
2. 조회 결과 확인
- 여기서 GROUP_LAYER을 이용하시면 계층형으로 게시판이 완성 됩니다.. !
총 정리
- 아직 계층형 게시판을 작성하는게 어려워서 하나하나 CASE를 쪼개어 만들어 봤습니다
- 더 좋은 방법이 있을지 궁금하네요 !
'SQL' 카테고리의 다른 글
MYSQL DATETIME 타입 DEFAULT VALUE를 지금 시간으로 설정하기 (0) | 2022.09.05 |
---|---|
SQL, Oracle로 Group By 일별, 주별, 월별, 년도별 (0) | 2022.03.22 |
SQL DEVELOPER 작업속도 느림, 렉 해결 (0) | 2022.03.20 |