본문 바로가기
Backend

09월 09일 월 | JSP 11 - JSP 미니 프로젝트 Ⅰ- 검색, 페이징

by 구라미 2019. 9. 9.

 

한 게시글의 총 답글 수 구하기

문제 1) 한 게시글의 총 답글 수 구하기 

SELECT count(grpno)-1 FROM tb_bbs WHERE grpno = 15;

한 게시글의 총 답글 수는 그룹번호가 같은 게시글들을 모아서 원본게시물 갯수 (1개)를 빼주면 된다.

그러나 이 방법은 모든 게시물의 답글 갯수를 계산해주지 않는다. 그렇기 때문에

그룹번호로 그룹을 묶어서 수를 세어주어야함.

 

SELECT grpno, count(grpno) as cnt - 1
FROM tb_bbs
GROUP BY grpno

 

부모게시글의 제목도 가져오기

 

답글갯수를 가져오는 가상의 논리테이블 AA를 만들어주고 그것을 물리테이블인 tb_bbs와 inner join 한 후

그룹번호, 답글갯수, 제목, indent를 조회한다. 그렇게만 하면 그룹넘버 중복된 것들이 조회되므로 부모게시물만 조회할 수 있게 WHERE indent = 0 이라는 조건을 달아준다.

SELECT AA.grpno, AA.cnt, tb_bbs.subject, tb_bbs.indent
FROM (
    SELECT grpno, count(grpno)-1 as CNT
    FROM tb_bbs
    GROUP BY grpno
) AA INNER JOIN tb_bbs
on AA.grpno = tb_bbs.grpno
WHERE indent = 0
ORDER BY AA.grpno DESC;

 

 

 

목록 중 위에서 5개까지 조회하기

문제 2) 목록 중, 위에서 5개 까지 조회

rownum을 이용해야하는데 어떻게 하는지 모르겠음

rownum<10을 했을때는 List페이지의 뷰대로 나오는데 <5 했을 때는 결과가 다르다.

 

1) 우선 조회하기

SELECT subject, grpno, ansnum
FROM tb_bbs
ORDER BY grpno DESC, ansnum ASC;

 

2) rownum 붙여서 조회하기

SELECT rownum, subject, grpno, ansnum, bbsno
FROM tb_bbs
ORDER BY grpno DESC, ansnum ASC;
--이렇게 하면 정렬이 뒤죽박죽된다. rownum이 제대로 나오려면 우선 정렬을 하고 글번호를 붙여야한다.

 

3) 셀프조인 후 rownum 조회해서 정렬된 rownum 얻기

--3 1의 SQL문을 셀프조인 후 rownum 추가
SELECT rownum, subject, grpno, ansnum
FROM ( SELECT subject, grpno, ansnum
       FROM tb_bbs
       ORDER BY grpno DESC, ansnum ASC
    )AA;

이렇게 하면 정렬된 글번호가 조회가 된다. 1~5의 게시물을 조회하려면 아래와같이 WHERE 조건절을 붙이면된다.

 

4) rownum이 1~5인 게시글 조회

--4 줄번호 1~5 조회
SELECT rownum, subject, grpno, ansnum
FROM ( SELECT subject, grpno, ansnum
       FROM tb_bbs
       ORDER BY grpno DESC, ansnum ASC
    )AA
WHERE rownum >=1 AND rownum <=5;

그런데 이렇게 하면 1~5 는 되는데 그 후의 값을 붙인 조건은 조회가 안된다. 제대로 조회하려면

줄번호가 있는 3의 테이블을 한번 더 셀프조인해야한다.

 

5) 페이징 조회 SQL문

SELECT rnum, subject, grpno, ansnum
FROM(
    SELECT rownum AS rnum, subject, grpno, ansnum
    FROM ( SELECT subject, grpno, ansnum
           FROM tb_bbs
           ORDER BY grpno DESC, ansnum ASC
        )
    ) WHERE rnum >=11 AND rnum <=16;

이렇게하면 빨간색 숫자부분을 어느 숫자로 만들어줘도 적용이 잘된다.

 

 

검색기능 넣기

페이징 + 검색
--제목에서 '어디' 검색해서 2페이지 출력

SELECT rnum, subject, grpno, ansnum
FROM(
    SELECT rownum AS rnum, subject, grpno, ansnum
    FROM ( SELECT subject, grpno, ansnum
           FROM tb_bbs
           WHERE subject like %어디%
           ORDER BY grpno DESC, ansnum ASC
        )
    ) WHERE rnum >=1 AND rnum <=10;

저 사이에 검색조회하는 조건문을 넣어주면 된다.

 

댓글