초급의 끄적거림

[프로젝트] 데이터베이스 복습 (답글 개수, 페이징 쿼리문) / 검색 폼 만들기 / 검색 목록으로 돌아가기 본문

실습

[프로젝트] 데이터베이스 복습 (답글 개수, 페이징 쿼리문) / 검색 폼 만들기 / 검색 목록으로 돌아가기

codingD 2019. 9. 9. 17:35

1. 데이터베이스 복습


답글 개수

 문제1) 부모 글의 답글개수를 sql 문으로 만들기 (예시)

  - 댓글에 답글의 개수를 적어 넣을 때 사용

부모글제목 답글개수
추석연휴 4
대한민국 2
무궁화 0
오필승코리아 1

 

 1) 확인 가능 한 것 :  부모글은 indent가 0 임을 알 수 있음

   select subject, grpno, indent, ansnum 

   from tb_bbs 

   order by grpno desc, indent asc;

 

 

  2) grpno가 동일한 행을 그룹화하고, 행 개수를 구하시오

     : 여기서 행의 개수는 부모 글을 포함한 개수 (문제에서 구하고자 하는 것은 '답글'만 이기 때문에 -1 할 것)

  select grpno, count(grpno) as cnt 

  from tb_bbs 

  group by grpno;


 
 

 

 

 

 

 

 

 

 3) 2에서 나온 개수는 부모글+자식글 이므로 개수에서 -1을 한다 → 얻고 싶엇던 '답변의 개수'만 구할 수 있음

  

  select grpno, count(grpno)-1 as cnt 

  from tb_bbs 

  group by grpno;

 

 

 

 

 

 

 

 

 

 4) 글제목을 부모글 하나만 가져오면 되기 때문에 grpno이나 ansnum으로 해도 됨

   : 3에서 구한 내용을 AA로 만들고 tb_bbs를 조인 (grpno을 기준으로)

  select AA.grpno, BBS.subject, AA.cnt, BBS.indent 
  from (select grpno, count(grpno)-1 as cnt 
             from tb_bbs 
             group by grpno) AA join tb_bbs BBS 
  on AA.grpno=BBS.grpno 
  where BBS.indent=0  --최초 부모글
  order by AA.grpno desc;

 

 

 

페이징 응용


  문제2) 목록중에서 위에서부터 5건 조회 (rownum : 주로 여러개의 결과를 출력하는 쿼리문을 실행 후 결과의 개수를 제한하여 가져옴)  

  : 페이징, rownum(줄번호) 활용

  1)

  select subject, grpno, ansnum 
  from tb_bbs 
  order by grpno desc, ansnum asc;

 

 

 

 

 

 

 

 

 2) rownum 활용 (줄번호까지 정렬됨)

   : rownum 이 있지만 안 보였던 상태에서 보이게 만듦, 

  select rownum, subject, grpno, ansnum 

  from tb_bbs 
  order by grpno desc, ansnum asc;

 

 

 

 

 

 

 

 

 

 3) 1의 SQL문을 셀프조인 후 rownum추가 (rownum이 일괄적으로 들어간 것을 확인)

  select rownum, subject, grpno, ansnum

  from(select subject, grpno, ansnum 
            from tb_bbs 
       order by grpno desc, ansnum asc) AA;

 

 

 

 

 

 

 

 

 

 

 4) 줄번호 1~5 조회

  select subject, grpno, ansnum 
  from(select subject, grpno, ansnum 
            from tb_bbs              

           order by grpno desc, ansnum asc) AA    

           where rownum between 1 and 5;

같은 표현

  select * from (select * from tb_bbs order by grpno desc, indent asc) 

  where rownum<=5;

  select rownum, subject, grpno, ansnum 

  from (select * from tb_bbs order by grpno desc, indent asc) 

  where rownum 1 between 5;

 

  5) 줄번호 6~10 조회 (2페이지)

  select subject, grpno, ansnum 
  from(select subject, grpno, ansnum 
             from tb_bbs 
             order by grpno desc, ansnum asc) AA 
  where rownum between 6 and 10;

 

  6) 줄번호가 있는 3의 테이블을 한번 더 셀프조인해서 rownum을 붙여서 하나의 완벽한 테이블로 만들고 다시 검색
    rownum칼럼명을 rnum으로 바꾼다

  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>=6 and rnum<=10;

 

  7) 페이징+검색 - 제목에서 '태풍' 검색해서 2페이지 출력 (6번을 그대로 복사하여 '태풍' 검색)

   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>=6 and rnum<=10;


2. bbs 폴더가 계속 변하고 있기 때문에 백업용으로 bbs_v1을 만들기

 

3. bbsList.jsp 에 '검색' 창 만들기


  3-1) 검색목록 (col 칼럼명, word 검색어 → 늘 가져와야하기 때문에 공통 코드라고 볼 수 있어서 ssi.jsp에 넣음)

<%
	//검색
    String col=request.getParameter("col");  	//검색칼럼
    String word=request.getParmetger("word");	//검색어칼럼
    
    //utility.java에 있는 checknull 사용
    //String값이 null이면 공백문자열 반환
    col=Utility.checkNull(col);
    word=Utility.checkNull(word).

%>

 

  3-2) list를 그대로 가져오면 되기 때문에 똑같은 list 함수를 사용하되 col과 word의 변수를 만들어 '검색' list를 

    BbsDAO.java에 만듦

public Arraylist<BbsDTO> list(String col, String word){
	ArrayList<BbsDTO> list=null;
    try{
    	Connection con=DBOpen.getConnection();
        StringBuilder sql=new StringBuilder();
        
        sql.append(" SELECT bbsno, subject, wname, readcnt, indent, regdt ");
    	sql.append(" FROM tb_bbs ");
         if(word.trim().length()>=1){ //검색어가 존재한다 라는 의미 = where 조건절로서 선택할 것을 찾아주기
		String search="";
		if(col.equals("wname")){ //검색하는 옵션에 있는 것들의 name을 넣어줌
			search+=" WHERE wname LIKE '%" +word+ "%' ";  //bbs.sql에서 작성한 쿼리문의 where 조건절을 만들어 준 것
		}else if(col.equals("subject")){ 
			search+=" WHERE subject LIKE '%" +word+ "%' ";  
		}else if(col.equals("content")){ 
			search+=" WHERE content LIKE '%" +word+ "%' ";  
		}else if(col.equals("subject_content")){ 
			search+=" WHERE subject LIKE '%" +word+ "%' ";
			search+=" OR content LIKE '%" +word+ "%' ";			//제목이나 내용 중 하나라도 해당할 때에 검색이 되게 하기로 함 (OR 사용)
		}//if end
		
		sql.append(search);
	  	}//if end
        
        sql.append(" ORDER BY grpno DESC, ansnum ASC ");
        
        PreparedStatement pstmt=con.prepareStatement(sql.toString());
        ResultSet rs=pstmt.executeQuery();
        if(rs.next()){
	  list=new ArrayList<>();
		do{
		BbsDTO dto=new BbsDTO();
		dto.setBbsno(rs.getInt("bbsno"));
		dto.setSubject(rs.getString("subject"));
		dto.setWname(rs.getString("wname"));
		dto.setReadcnt(rs.getInt("readcnt"));
		dto.setIndent(rs.getInt("indent"));
		dto.setRegdt(rs.getString("regdt"));
		list.add(dto);
		}while(rs.next());
	  }//if end
    }catch(Exception e){
    	System.out.println("검색 실패 : : +e);
    }//try end
    return list
}//list() end

 

검색 내용이 없는 경우, 관련자료 없음 이라는 문구 발생

 

 

4. 게시판에서 검색을 했을 때 검색결과에서 '목록' 버튼을 누르면 검색이 된 목록이 유지


  - 검색을 했을 때 URL이 변한 것을 볼 수 있음

'제목+내용'을 '장'으로 검색했을 때 URL

  - bbsList.jsp 에서 <a> 태그에서 read로 넘어가는 조건에 검색할 때 필요한 col과  word를 받아 올 수 있게 추가함

  - bbsRead.jsp 에서 '검색목록'을 누르면 검색을 해서 나온 글 목록만 나타날 수 있게 해야하기 때문에 위의 URL를 참고하여 필요한 col과 word를 적어줌 

 

  4-1). 수정을 하든 답변을 하든 삭제를 하든 방금 전까지 보고 있었던 목록이 남아 있을 수 있게 하는 것

   ex) '장'을 검색 후 글을 삭제했을 때는 삭제 후 '장'을 검색한 검색목록으로 돌아갈 수 있도록 함

   - bbsRead.jsp (상세보기) 에서 '삭제' 버튼에 검색어가 적용 될 수 있도록 해당하는 칼럼명 col, word 전달

 

  4-2) 삭제 (bbsDel.jsp) : 검색되었던 글을 남기기 위해서 히든으로 검색칼럼(col)과 검색어 칼럼(word)을 가져옴

  4-3) 액션을 취해서 DelProc : 그냥 bbsList.jsp로 넘겨버리면 검색했던 것이 없어지고 원래 list로 가기 때문에 검색어를 넣어줘야함  

 

 

5. 검색한 후 수정 목록


  5-1) bbsUpdate

   - 위와 똑같이 히든으로 col과 word를 가져오고 bbsUpdateProc.jsp의 링크가 col와 word를 포함할 수 있도록 수정

 

6. 검색한 후 답글 목록


  6-1) bbsReply

   - 위와 똑같이 히든으로 col과 word를 가져오고 bbsReplyProc.jsp의 링크가 col와 word를 포함할 수 있도록 수정

 

Comments