테스트 사이트 - 개발 중인 베타 버전입니다

특정조건의 포인트내역 삭제방법 문의 채택완료

사스라이 4년 전 조회 1,996

안녕하세요. 회원가입할때 생기는 포인트 외에 다른 내역이 없는 회원들의 포인트를 삭제하고 싶습니다.

처음에는 DB에서 직접

 

SELECT *

FROM `g5_point`

GROUP BY mb_id

HAVING count(mb_id) = 1  

 

이런 식으로 검색해서 나온 결과를 몽땅 삭제해주었더니 g5_member 쪽의 mb_point쪽이 변화가 없더라구요. 아차! 싶었죠 ㅠㅠ 뭐 당연한 결과이죠..

 

그래서 일단은 원래대로 복구해놓고 이번엔 관리자화면 포인트 내역에서 삭제하면 되겠다 싶어서 제가 원하는 내역을 출력하기 위해 /adm/point_list.php에서  포인트내역을 불러오는 쿼리를 위와 똑같이 수정했더니 원래 갯수보다 너무 많이 나와버리니 이것도 아닌것 같고ㅠㅠ

 

요점은 포인트내역 갯수가 1개뿐인 회원들의 포인트내역삭제와 함께 member테이블의 mb_point에도 반영할 수 있는 좋은 방법이 있는지 도움을 구합니다. 감사합니다.

댓글을 작성하려면 로그인이 필요합니다.

답변 2개

채택된 답변
+20 포인트
4년 전

https://gnustudy.com/bbs/board.php?bo_table=gnu_tip&wr_id=217

참고해서 조건만 바꿔서 해보세요.

로그인 후 평가할 수 있습니다

답변에 대한 댓글 1개

사스라이
4년 전
애시당초 제가 처음에 작성했던 쿼리에는 조건절이 없어서
포인트리스트 목록으로 불러오기 어려웠었나봅니다.

아래코드처럼 WHERE절을 추가해서 수정했더니 해결되었습니다.

SELECT *
FROM g5_point
WHERE mb_id IN (
    SELECT mb_id
    FROM g5_point
    GROUP BY mb_id
    HAVING COUNT(*) = 1
)

알려주신 링크가 도움이 되었습니다.
감사합니다.

댓글을 작성하려면 로그인이 필요합니다.

SELECT * FROM `g5_point` GROUP BY mb_id HAVING count(mb_id) = 1  

이것도 가능합니다만

bbs/"register_form_update.php"를 보면

    // 회원가입 포인트 부여     insert_point($mb_id, $config['cf_register_point'], '회원가입 축하', '@member', $mb_id, '회원가입');

이렇게 되어 있습니다. 우선은 회원 가입 포인트만 고르고

 select a.* from g5_point a left join g5_point b on a.mb_id=b.mb_id and a.po_id < b.po_id  where a.po_rel_table='@member' and b.po_id is null;

g5_member.mb_point에서 차감하면 되겠네요.

update ( select a.* from g5_point a left join g5_point b on a.mb_id=b.mb_id and a.po_id < b.po_id  where a.po_rel_table='@member' and b.po_id is null ) a inner join g5_member b on a.mb_id=b.mb_id

set b.mb_point=b.mb_point-a.po_point

그리고 회원 가입 포인트을 삭제하면 되겠네요.

delete a from  g5_point a left join g5_point b on a.mb_id=b.mb_id and a.po_id < b.po_id  where a.po_rel_table='@member' and b.po_id is null;

 

꼭 백업 후에 시도해 보세요.

 

로그인 후 평가할 수 있습니다

답변에 대한 댓글 2개

사스라이
4년 전
공부삼아 시도해봤더니 완벽하게 작동했습니다!!!

왜 같은 테이블을 a, b로 나누었을까하고 검색해보니 셀프조인이라는 게 있네요.
DB지식이 어정쩡하게 있어서 100%이해는 못했습니다.
b.po_id에 어떻게 null값이 들어가는건지(?)만 이해한다면 정답이 보일 듯 하네요.

이미 채택이 끝난 뒤에 답변을 달아주셔서 좋아요로 대신합니다ㅠㅠ
감사합니다.
엑스엠엘
4년 전
잘 된다니 다행입니다.

is null 조건이 조인할 때 최대, 혹은 최소 값을 구할 수 있는 조건입니다.

댓글을 작성하려면 로그인이 필요합니다.

답변을 작성하려면 로그인이 필요합니다.

로그인