안녕하세요.
계층형 쿼리를 사용하여 답변게시판 정렬을 하려고합니다.
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 |
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 로 설정했는데 댓글의 최대 깊이 감안하여 늘려주시면 됩니다.