쿼리 질문드립니다~
본문
저번에 한번 질문드렸던 쿼리인데요.
신고 게시판(누적)이구요.
신고 횟수로 검색하는 기능때문에 문의 드립니다.
신고 게시판(누적)은..
1. 사용자가 게시물을 보다가 신고할만한 게시물이면 신고버튼을 눌러서 신고합니다.
2. 원문그대로 g5_write_report 테이블에 복사합니다.
3. 관리페이지에서 확인합니다.
4. 게시물을 신고 하게 될 경우에는 report table에서 해당 게시글의 존재 유무를 검색한 후 wr_15를 wr_15 = wr_15 + 1 해줍니다.
5. 관리자는 신고게시판(누적)에서 게시글이 얼마나 많이 신고 되었는지 볼 수 있습니다.
6. 누적 신고 횟수로 검색을 합니다.
7. sfl = wr_15입니다.
8. 만약 누적신고 횟수로 select box를 놓고 2를 검색하면 wr_15 필드의 값이 2인 게시물이 모두 검색되는게 아니라, 2번 신고된 게시물만 나왔으면 합니다.
저번에 답변주신 분들께서 많은 도움을 주셔서 이차저차 하고 있는데요.
누적신고 횟수를 1로 검색하면 원하는 검색결과 값이 나오는데
2로 할 경우에는 아예 나오지 않습니다. DB에 보면 분명히 누적신고 횟수가 2인 게시물이 3개가 존재하는데, list는 만들어지는것 같은데 게시물을 불러오지 못합니다 ㅠㅠ
검색 쿼리는 아래와 같습니다.
아래 쿼리에서 wr_11은 원게시물의 wr_id 값이고 wr_20은 원게시물의 bo_table 값입니다.
$sql = " SELECT b.* FROM
(SELECT wr_id, max(wr_15) AS stack
FROM {$write_table}
WHERE wr_is_comment = 0
AND wr_15 > 0
GROUP BY wr_11, wr_20
HAVING stack = '$stx'
ORDER BY wr_id
) AS a
LEFT JOIN {$write_table}
AS b on a.wr_id = b.wr_id
AND a.stack = b.wr_15";
서브쿼리만으로 조회 해보니
실제 누적신고횟수가 2인 게시물의 wr_id 값과
서브쿼리로 조회된 wr_id 값이 상이하다는걸 발견했습니다.
[정상]
wr_id | stack
112 | 2
115 | 2
117 | 2
[서브쿼리 조회 결과]
wr_id | stack
111 | 2
107 | 2
59 | 2
wr_id가 112인 게시물과 111인 게시물의 wr_11과 wr_20필드의 값은 같습니다.
다만 112인 게시물이 최근에 게시물을 신고한 게시물인데(?) 왜 111값이 나오는지 모르겠습니다 ㅠㅠ
115와 107 그리고 117과 59도 112, 111 케이스와 같구요.
왜 서브쿼리에서 최근에 신고된 게시물을 가져오지 못할까요?
!-->
답변 2
그럼 sub query 를 이렇게 수정하시면 되겠네요.
wr_12 가 원글 게시글 bo_table 값이고
wr_20 이 원글 게시글 wr_id 값이라면
문의한 내용의 Query 는 잘못되었으며,
SELECT wr_id, max(wr_15) AS stack FROM {$write_table}
WHERE wr_is_comment = 0 AND wr_15 > 0
GROUP BY wr_11, wr_20 HAVING stack = '$stx'
ORDER BY wr_id
를SELECT wr_12, wr_20, max(wr_15) AS stack FROM {$write_table}
WHERE wr_is_comment = 0 AND wr_15 > 0
GROUP BY wr_12, wr_20 HAVING stack = '$stx'
으로 고쳐야 합니다.
그 이유는 구하고자 하는 값을 가지고 있는 Column이 wr_12, wr_20 이며
또한 Group by의 기준이기 때문입니다.
' ORDER BY wr_id ' 는 전체 Query의 마지막 부분에 해야 원하는 Order by가 됩니다.
sub query의 group by에서 `wr_20` 는 왜 들어가 있는 것일까요 ?
group by의 by절에는 select에 있는 항목들만 있어야 합니다.
select된 값들을 기준으로 group by를 수행하는 것이기 때문입니다.
따라서 group by에 wr_20이 추가되어 있어는 것이 첫번째 문제 같습니다.
일단 sub query에서 wr_20을 빼고 다시 확인해보시기 바랍니다.