일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
- HTTP Status 404
- jQuery
- github
- git
- 성적프로그램
- 부트스트랩
- tomcat
- ||
- HTML
- rownum
- oracle
- alias
- group by
- Oracle DB
- CRUD
- 과정평가형
- SQL
- Bootstrap
- 모조칼럼
- Java
- JavaScript
- HTTP Status 500
- 한글 인코딩
- 제약조건
- JSP
- 답변형 게시판
- 이클립스
- Oracle SQL
- sql developer
- distinct
초급의 끄적거림
[프로젝트] 데이터베이스 복습 (답글 개수, 페이징 쿼리문) / 검색 폼 만들기 / 검색 목록으로 돌아가기 본문
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 |
3) 1의 SQL문을 셀프조인 후 rownum추가 (rownum이 일괄적으로 들어간 것을 확인)
select rownum, subject, grpno, ansnum from(select subject, grpno, ansnum |
4) 줄번호 1~5 조회
select subject, grpno, ansnum 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이 변한 것을 볼 수 있음
- 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를 포함할 수 있도록 수정
'실습' 카테고리의 다른 글
[프로젝트] id, email 중복확인 / 회원가입 (1) | 2019.09.16 |
---|---|
[프로젝트] 글 개수 / 한 페이지에 글 개수 / 페이징 (0) | 2019.09.10 |
[프로젝트] 답변형 게시판 (답변 / 새글표시 / 조회수 많은 글 표시) (0) | 2019.09.06 |
[프로젝트] 상세보기 (조회 수 삽입, 특수문자 삽입)/삭제/수정 (0) | 2019.09.05 |
[프로젝트] 경로 / 답변형 게시판 만들기 (폼, 쓰기, 글 목록) (0) | 2019.09.04 |