본문 바로가기

SQL

계층형 게시판 만들기/ mysql

테이블 만들기 

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를 쪼개어 만들어 봤습니다 

- 더 좋은 방법이 있을지 궁금하네요 !