2017-01-23 2 views
0

나는 사용자가 코멘트 작성 (+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 개).

올바른 값을 얻기 위해 수식이나 쿼리에서 사용할 수있는 아이디어가 있습니까?

+0

당신이'GROUP BY'close보고 시도해 봤어 취득하기 전에? GROUP BY user_id와 같은 것을 놓치거나 GROUP BY 그룹을 원하는 것 같지 않은 것 같아요. –

+1

그 예에서 원하는 결과가 0이 아닌 500이라는 이유에 대해 자세히 설명해 주시겠습니까? –

+0

@IkeWalker : 질문을 업데이트했습니다. 요약 : 사용자가 자신의 포인트 (-500)를 사용할 때 "가장 오래된"포인트를 먼저 사용하고 이후 포인트를 사용할 수 없기 때문에 500 포인트가 올바른 결과입니다. 가정하면 2016-04-01에서 +1000 포인트를 제외하고 이미 500 개가 사용되었습니다 (2016-05-01에 -500 개). – bernhardh

답변

0
SELECT SUM(case when points < 0 and create_at < (
    select min(create_at) from userpoints_log where user_id = X 
    and created_at > DATE(NOW()-INTERVAL 1 YEAR) and points > 0 
) then 0 else points) AS 'result' 
FROM userpoints_log 
WHERE user_id = X AND created_at > DATE(NOW()-INTERVAL 1 YEAR) 

psedo 코드이지만 해당 논리를 사용할 수 있습니다.
1. 먼저 + 포인트 일자
2. 변화를 찾을 수 - 포인트 데이터를 처음

관련 문제