특정조건의 포인트내역 삭제방법 문의

특정조건의 포인트내역 삭제방법 문의

QA

특정조건의 포인트내역 삭제방법 문의

답변 2

본문

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

처음에는 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

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

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

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

아래코드처럼 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;

 

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

 

공부삼아 시도해봤더니 완벽하게 작동했습니다!!!

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

이미 채택이 끝난 뒤에 답변을 달아주셔서 좋아요로 대신합니다ㅠㅠ
감사합니다.

답변을 작성하시기 전에 로그인 해주세요.
QA 내용 검색
질문등록
filter #DB ×
전체 840
© SIRSOFT
현재 페이지 제일 처음으로