쿼리 질문 하나 더 드리겠습니다...

쿼리 질문 하나 더 드리겠습니다...

QA

쿼리 질문 하나 더 드리겠습니다...

본문

신고 게시판을 만들어 테스트 중입니다.

로직은

1. 각 게시판 view 에 있는 신고 버튼을 누른다

2. 사유를 선택한다.

3. 신고한다.

4. 신고된 게시물을 g5_write_report 테이블로 복사한다.

5. 회원당 같은 게시물을 두번 신고할 수는 없다.

6. g5_write_report 에 이전에 같은 게시물이 신고됐다면 그 게시물의 wr_15필드값을 구해서

  지금 신고된 게시물의 wr_15 필드에 +1을 해준다.

 

7. 관리자 페이지(g5_write_report 아님)에 게시물의 신고횟수를 보여준다.

 

1~6번 까지는 모두 해결했는데요

7번이 지금 좀 문제인게.

같은 게시물이 여러번 신고되고 또 신고사유가 달라지면

즉, g5_write_report 에는 여러번 쌓입니다. 이 쌓이는 데이터로

 

게시물들의 신고수를 구하려고 하는데요.


$sql = "SELECT *, GROUP_CONCAT(DISTINCT ca_name ORDER BY ca_name) AS reason FROM g5_write_report WHERE wr_is_comment = 0 GROUP BY wr_parent, wr_20 ORDER BY wr_15 DESC, wr_18 DESC";

 

ca_name <- 신고사유

wr_20 <- 신고게시물이 있는 게시판

wr_15 <- 신고횟수

 

 

이렇게 쿼리를 날려서 보내면..

2번 신고된 게시물이면 wr_15 필드값이 2가 들어와야 하는데

위의 쿼리로 조회했을때는 wr_15 필드 값이 1이 됩니다;

2번 신고된 게시물인데...첫번째 신고된 게시물을 가져와 버립니다;;

마지막에 신고된 게시물을 가져오려면 서브쿼리를 써야할까요 아니면..

조건절을 추가해야 하나요!?

 

GROUP BY 에 wr_15를 추가하게 되면

g5_write_report에 신고된 게시물이 모두 출력됩니다.

 

전 가장 최근에 신고된 게시물만 가져오고 싶습니다.......ㅠ

 

이 질문에 댓글 쓰기 :

답변 2

count를 빼먹으셨네요^^

wr_15에 신고 횟수를 어떻게 넣어주시는 지는 모르겠지만...

group by 하시면 중복된 행은 제거됩니다.

하지만 wr_15같은 경우에는 행의 wr_15컬럼에 값이 들어가있겠죠?

만약에 같은 게시물에 2번 신고내용이 접수되었다면 두개의 신고 내용이 기록된 행의 wr_15에 모두 +1씩 해줘야 합니다.

 

우선 제 생각에는 저런식의 로직 보다는,

신고 갯수 wr_15컬럼을 배제하시고,


$sql = "SELECT *, GROUP_CONCAT(DISTINCT ca_name ORDER BY ca_name) AS reason, count(wr_parent) as report_cnt FROM g5_write_report WHERE wr_is_comment = 0 GROUP BY wr_parent, wr_20 ORDER BY wr_15 DESC, wr_18 DESC";

위의 소스와 같이 count(wr_parent) as report_cnt구문을 삽입하여 신고된 횟수를 구하는 것이 정확할 것으로 생각됩니다.^^

 

이렇게 하시면 1~6번 로직들을 수정하지 않으시고도 해당게시물의 신고횟수를 실시간으로 조회하실 수 있을 것입니다.

제일 간단하게 설명드리겠습니다.

1. 각 게시판 view 에 있는 신고 버튼을 누른다

2. 사유를 선택한다.

3. 신고한다.

4. 신고된 게시물을 g5_write_report 테이블로 복사한다.

--------------------------------- 1~4번까지는 기존과 동일합니다.

 

5. 회원당 같은 게시물을 두번 신고할 수는 없다.

-> 신고가 됬다면 사유, 게시글번호, 게시판이름, 신고한 회원아이디를 새로운 테이블에 insert합니다.

그러면 추가 신고를 하려고 하면 새로운 테이블에 게시글,게시판이름,회원아이디를 검색해서 존재하면 신고 버튼을 보이지 않게 처리하면 됩니다.

 

6. g5_write_report 에 이전에 같은 게시물이 신고됐다면 그 게시물의 wr_15필드값을 구해서

  지금 신고된 게시물의 wr_15 필드에 +1을 해준다.

->이전의 신고된 wr_15필드의 값을 구할 필요없습니다. 그냥 신고가 되고 새로운 테이블에 신고 내역이insert되면 같은 게시물에 wr_15필드 + 1로 업데이트합니다.

 

7. 관리자 페이지(g5_write_report 아님)에 게시물의 신고횟수를 보여준다.
->관리자 페이지에 메뉴를 하나 만들어서 우선 전체 게시물을 가져옵니다.

예를들어 현재 제가 사용중인 화면을 캡쳐했습니다.

31205116_1521600504.4002.png

우측에 표시해둔 부분에 현재 게시물의 신고 개수를 출력해줍니다.

방법은 간단합니다.

select count(*) as cnt from 새로운테이블명 where wr_id='게시물번호' and bo_table = '게시판명' 으로

해당 게시물의 신고 개수를 가져오면됩니다. 

그러면 같은 게시물번호, 게시판명에 작성된 모든 row의 개수가 계산되므로 전체 개수를 출력하면되고

신고내역 로그가 새로운 테이블에 매번 쌓이기 때문에 신고내역 페이지도 구현이 가능합니다.

그누위즈님 답변 잘 보았습니다^^
근데... 저렇게 해버리면 신고 게시물 갯수가 1000개이면... 쿼리를 1001개 날리는 격이 될텐데.... 성능상의 문제가 생기지 않을까요?!^^;;

엔바이츠님 답변 감사합니다.
신고 갯수가 1000개라도 select count(*) as cnt 이렇게 조회를 하기 때문에 쿼리는 한번만 실행됩니다.
게시글1개당 select count(*) as cnt 조회를 하기 때문에 게시글 1개당 1번 실행입니다.
제가 설명드리는 방식은
신고 테이블을 새로 작성해서 신고 테이블에 신고 내역이 매번 쌓입니다.
위의 캡쳐 화면에서 게시글목록이 쭉이보이는데 제일 우측의 빨강색으로 표시한부분에
select count(*) as cnt 쿼리를 실행해서 해당글의 전체 신고 카운트를 가져오는 것 입니다.
만약 위에 캡쳐화면처럼 게시글의 정보를 직접 가져오는 경우 단순 $row['wr_15'] 의 형식으로
여분필드에 저장된 카운터를 출력해주면 select count(*) as cnt 쿼리를 실행시킬 필요성은 없어보입니다.

챕쳐의 화면은 전체 게시글의 목록이고 우측에는 신고 개수를 카운트해서 가져오는 부분입니다.
신고 내역의 목록이 아닌 전체 게시글의 목록이므로 해당 게시글의 여분필드에 따로 신고 개수가 없다면
위와 같은 select count(*) as cnt 방식으로 신고내역 테이블에 저장된 같은 글의 카운트를 가져오는 것이기 때문에 제가 생각한 프로그램과 다른 생각으로 말씀을 하셨던 것 같습니다.
엔바이츠님의 말씀은 캡쳐화면이 전체 신고 내역으로 생각을 하신것 같네요 그렇다면 말씀하신 1000번의 쿼리가 이해가 됩니다.

그누위즈님 말씀이라면


<tbody>
			<?php 
				for ($i = 0; $row = sql_fetch_array($result); $i++) {
				  $bg = 'bg' . ($i % 2);
			?>
			<tr class="<?php echo $bg; ?>">
				<td scope="row" class="td_parent">
					<?php echo $row['wr_parent'] ?>
				</td>
				<td scope="row" class="td_name">
					<?php echo $row['wr_name'] ?>(<?php echo $row['mb_id']?>)
				</td>
				<td scope="row" class="td_subject">
					<?php echo $row['wr_subject'] ?>
				</td>
				<td scope="row" class="td_reason">
					<?php echo $row['reason']; ?>
				</td>
				<td scope="row" class="td_reg">
					<?php echo $row['wr_datetime'] ?>
				</td>
				<td scope="row" class="td_report">
					<?php echo $row['wr_18'] ?>
				</td>
				<td scope="row" class="td_board">
					<?php echo $row['wr_11'] ?>
				</td>
				<td scope="row" class="td_count">
					<?php //echo $row['report_cnt']; ?>
                                        $sql_cnt = "select count(*) as cnt from table where......"
                                        $row_cnt = sql_fetch($sql_cnt);
                                        echo $row_cnt['cnt'];
				</td>
			</tr>
			<?php } ?>
			<?php if ($i == 0) { echo '<tr><td colspan="'.$colspan.'" class="empty_table">신고된 게시물이 없습니다.</td></tr>'; } ?>
		
		</tbody>



이렇게 하는건가요?
제가 못알아들은 건지ㅠ

일단 엔바이츠님 소스로 수정은 했습니다.
답변 매우매우 감사드립니다 두분 모두

답변을 작성하시기 전에 로그인 해주세요.
전체 123,645 | RSS
QA 내용 검색

회원로그인

(주)에스아이알소프트 / 대표:홍석명 / (06211) 서울특별시 강남구 역삼동 707-34 한신인터밸리24 서관 1404호 / E-Mail: admin@sir.kr
사업자등록번호: 217-81-36347 / 통신판매업신고번호:2014-서울강남-02098호 / 개인정보보호책임자:김민섭(minsup@sir.kr)
© SIRSOFT