계층형쿼리 정렬 0 4 3,162

by 밍밍밍밍 [MySQL] mariadb 계층 [2021.10.18 19:00:09]


20211018_185919.png (7,362Bytes)

안녕하세요.

계층형 쿼리를 사용하여 답변게시판 정렬을 하려고합니다.

 

WITH RECURSIVE cte AS ( 
SELECT a.* 
FROM tb_board a 
WHERE a.parent_no = 0 
UNION ALL 
SELECT a.* FROM cte p 
INNER JOIN tb_board a ON p.no = a.parent_no 
) 
SELECT ROW_NUMBER() OVER(ORDER BY a.parent_no ASC, a.no DESC) ROWNUMBER 
, a.no  
, a.title
, a.parent_no
, DATE_FORMAT(a.REG_DATE, '%Y.%m.%d %H:%i:%S') AS REG_DATE
FROM cte a INNER JOIN tb_menu b ON a.mu_no = b.mu_no
WHERE a.del_yn != 'Y' AND b.del_yn != 'Y'
and a.mu_no = '253'
ORDER BY ROWNUMBER desc LIMIT 10 OFFSET 0

 

원하는 결과는 아래표인데 첨부파일처럼 결과가 나오고있습니다. 정렬을 맞게하려면 어떻게 수정해야할까요?

rownumber no title parent_no reg_date
5 185016 테스트3 0 2021.10.18 18:45:12
4 185017 답글테스트3 185016 2021.10.18 18:56:12
3 185015 테스트2 0 2021.10.18 18:45:05
2 185013 테스트1 0 2021.10.18 18:44:23
1 185014 답글테스트1 185013 2021.10.18 18:44:43

 

 

by 마농 [2021.10.19 09:50:17]

샘플에 댓글만 보이는데? 대댓글, 대대댓글도 가능한가요?
원하는 순서가 본글은 최신순, 댓글은 등록순 맞지요?


by 밍밍밍밍 [2021.10.19 10:24:43]

대댓글,대대댓글도 가능합니다.

순서도 본글 최신순, 댓글은 등록순이 맞습니다!


by 마농 [2021.10.19 10:53:18]
WITH RECURSIVE cte AS
(
SELECT a.no
     , a.title
     , a.parent_no
     , a.reg_date
     , a.del_yn
     , CAST(LPAD(ROW_NUMBER() OVER(ORDER BY no DESC), 8, '0') AS VARCHAR(99)) ord
  FROM tb_board a
 WHERE parent_no = 0
   AND mu_no = 253  -- 이 조건 먼저 처리
 UNION ALL
SELECT a.no
     , a.title
     , a.parent_no
     , a.reg_date
     , a.del_yn
     , CONCAT(p.ord, LPAD(a.no, 8, '0')) ord
  FROM cte p
 INNER JOIN tb_board a
    ON p.no = a.parent_no
)
SELECT ROW_NUMBER() OVER(ORDER BY a.ord) rownumber
     , a.no
     , a.title
     , a.parent_no
     , DATE_FORMAT(a.reg_date, '%Y.%m.%d %H:%i:%S') reg_date
  FROM cte a
 INNER JOIN tb_menu b
    ON a.mu_no = b.mu_no
 WHERE a.del_yn != 'Y'
   AND b.del_yn != 'Y'
 ORDER BY rownumber
 LIMIT 10 OFFSET 0
;

1. mu_no = 253 조건은
- 계층 전개 이후에 주는것 보다는
- 계층 전개 이전에 주는게 좋습니다.
2. 정렬용 항목
- 본글의 경우 no DESC 정렬한 row_number 을 이용하고
- 댓글은 no 를 그대로 이용하여 이어 붙여 정렬용 항목을 만듭니다.
- 이때 no 의 자리수를 8자리로 고정했는데. no 의 최대 자리수 감안하여 늘려주시면 됩니다.
- 최대 길이는 99 로 설정했는데 댓글의 최대 깊이 감안하여 늘려주시면 됩니다.


by 밍밍밍밍 [2021.10.19 11:02:51]

답변감사드립니다!

해당쿼리로 테스트해보겠습니다

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