나는 사용자가 코멘트 작성 (+5 점), 이미지 업로드 (+10 점) 등과 같은 특정 활동에 대해 "userpoints"를 얻을 수있는 사용자 커뮤니티를 운영하고 있습니다. T 셔츠처럼 물건을 사는 데 익숙해 져야합니다 (-100 포인트).MySQL 테이블 - 지난 12 개월 동안의 포인트 계산
- 아이디 (INT, PK) (사용자 테이블 INT, FK)
- USER_ID (액션 테이블 INT, FK)
- 의 action_id
- 점 : 모든 작업은 MySQL의 테이블
userpoints_log
에 기록됩니다 (INT, 5 또는 -100과 같은 점 자체) - created_at (일) 현재
, 난 그냥함으로써, 각 사용자에 대한 userpoints을 계산 합니다 (USER_ID로 식별)이 테이블의 모든 포인트 로그: 모든 (긍정적) 포인트 12 개월 동안 만 유효해야하기 때문에
SELECT SUM(points) AS 'result' FROM userpoints_log
WHERE user_id = X
GROUP BY user_id
는 지금은,이 계산을 변경해야합니다. 우선 나는 다음과 같이한다 :
SELECT SUM(points) AS 'result' FROM userpoints_log
WHERE user_id = X AND created_at > DATE(NOW()-INTERVAL 1 YEAR)
GROUP BY user_id
그러나 그것은 나에게 잘못된 결과를 준다. 예를 들어, 다음과 같은 데이터 집합 : 나는 2017년 4월 15일에 위의 쿼리를 실행한다면
created_at |points
------------------
2016-04-01 | +1000
2016-05-01 | -500
2016-06-01 | +500
, 나는 결과로 정확하지 않은 0 (-500 + 500)을 얻을 것 사용자는 500 점을 가져야하기 때문입니다.
500 포인트가 올바른 결과입니다. 사용자가 자신의 포인트 (-500)를 사용할 때 "가장 오래된"포인트를 먼저 사용하고 이후 포인트를 사용할 수 없기 때문입니다. 가정하면 2016-04-01에서 +1000 포인트를 제외하고 이미 500 개가 사용되었습니다 (2016-05-01에 -500 개).
올바른 값을 얻기 위해 수식이나 쿼리에서 사용할 수있는 아이디어가 있습니까?
당신이'GROUP BY'close보고 시도해 봤어 취득하기 전에? GROUP BY user_id와 같은 것을 놓치거나 GROUP BY 그룹을 원하는 것 같지 않은 것 같아요. –
그 예에서 원하는 결과가 0이 아닌 500이라는 이유에 대해 자세히 설명해 주시겠습니까? –
@IkeWalker : 질문을 업데이트했습니다. 요약 : 사용자가 자신의 포인트 (-500)를 사용할 때 "가장 오래된"포인트를 먼저 사용하고 이후 포인트를 사용할 수 없기 때문에 500 포인트가 올바른 결과입니다. 가정하면 2016-04-01에서 +1000 포인트를 제외하고 이미 500 개가 사용되었습니다 (2016-05-01에 -500 개). – bernhardh