쿼리 질문드립니다~

쿼리 질문드립니다~

QA

쿼리 질문드립니다~

본문

저번에 한번 질문드렸던 쿼리인데요.

 

신고 게시판(누적)이구요.

신고 횟수로 검색하는 기능때문에 문의 드립니다.

 

신고 게시판(누적)은..

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가 됩니다.


" SELECT b.* FROM 
					(SELECT wr_id, wr_12, wr_20, max(wr_15) AS stack 
						FROM {$write_table}
						WHERE wr_is_comment = 0
						GROUP BY wr_12, wr_20
						HAVING stack = '$stx'
					) AS a
					LEFT JOIN {$write_table} 
					AS b on a.wr_id = b.wr_id 
					AND a.stack = b.wr_15
					";


말씀해 주신 것처럼 subquery 를 수정했는데요.
조회 결과가 마찬가지로

[서브쿼리 조회 결과]
wr_id | stack
111 | 2
107 | 2
59 | 2

이렇게 나옵니다ㅠ

sub query의 group by에서  `wr_20` 는 왜 들어가 있는 것일까요 ?

group by의 by절에는 select에 있는 항목들만 있어야 합니다.

select된 값들을 기준으로 group by를 수행하는 것이기 때문입니다.

따라서 group by에 wr_20이 추가되어 있어는 것이 첫번째 문제 같습니다. 

일단 sub query에서 wr_20을 빼고 다시 확인해보시기 바랍니다.

wr_12 가 원글 게시글 bo_table 값이고
wr_20 이 원글 게시글 wr_id 값이라
두개가 같은게 같은 게시물이 됩니다.

1번
wr_12 = "Free"
wr_20 = 1

2번
wr_12 = "Free"
wr_20 = 2

3번
wr_12 = "Fun"
wr_20 = 1

4번
wr_12 = "Fun"
wr_20 = 1


이렇게 되면 1번과 2번은 다른 게시물이고 3번과 4번은 같은 게시물이기 때문에
wr_12와 wr_20으로 group by 를 해줘야 합니다;

그렇다면 sub query 에 wr_20을 select 해보면 될것 같은데
sub query 에 select 문에 wr_20와 wr_12를 넣어도 결과는 마찬가지네요 ㅠ

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

회원로그인

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