특정조건의 포인트내역 삭제방법 문의 채택완료
안녕하세요. 회원가입할때 생기는 포인트 외에 다른 내역이 없는 회원들의 포인트를 삭제하고 싶습니다.
처음에는 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
참고해서 조건만 바꿔서 해보세요.
답변에 대한 댓글 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개
왜 같은 테이블을 a, b로 나누었을까하고 검색해보니 셀프조인이라는 게 있네요.
DB지식이 어정쩡하게 있어서 100%이해는 못했습니다.
b.po_id에 어떻게 null값이 들어가는건지(?)만 이해한다면 정답이 보일 듯 하네요.
이미 채택이 끝난 뒤에 답변을 달아주셔서 좋아요로 대신합니다ㅠㅠ
감사합니다.
is null 조건이 조인할 때 최대, 혹은 최소 값을 구할 수 있는 조건입니다.
댓글을 작성하려면 로그인이 필요합니다.
답변을 작성하려면 로그인이 필요합니다.
로그인
포인트리스트 목록으로 불러오기 어려웠었나봅니다.
아래코드처럼 WHERE절을 추가해서 수정했더니 해결되었습니다.
SELECT *
FROM g5_point
WHERE mb_id IN (
SELECT mb_id
FROM g5_point
GROUP BY mb_id
HAVING COUNT(*) = 1
)
알려주신 링크가 도움이 되었습니다.
감사합니다.