나의 제안 :
가 previous_points
열을 만든 다음이 간단한 쿼리를 매일 밤을 실행
UPDATE table SET previous_points = points;
그런 다음 단순히 각각
points
또는
previous_points
를 사용, 현재 또는 이전 일에 의해 순위를 표시합니다.
편집
당신은이 데이터를 사용하기 위해 임시 테이블을 사용할 수 있습니다.
1 : 여기
은 예입니다
SET @rank := 0;
CREATE TEMPORARY TABLE ranks_today
(id INT(8), rank INT(6), previous_rank INT(6))
SELECT id, @rank:= @rank + 1 AS rank
FROM users
ORDER BY points DESC;
: 2 : 어제의 순위에 대한 임시 테이블 :
SET @rank := 0;
CREATE TEMPORARY TABLE ranks_yesterday
(id INT(8), rank INT(6))
SELECT id, @rank:= @rank + 1 AS rank
FROM users
ORDER BY previous_points DESC;
3 : 오늘의 순위로 채워 임시 테이블을 확인 지금 어제의 순위를 편의를 위해 오늘의 테이블로 복사합니다 :
UPDATE ranks_today, ranks_yesterday
SET ranks_today.previous_rank = ranks_yesterday.rank
WHERE ranks_today.id = ranks_yesterday.id;
4 : 마지막으로, 사용자의 이름을 표시하는 쿼리는, 오늘과 어제 순위뿐만 아니라 변화 :
SELECT u.name, t.rank, t.previous_rank, t.previous_rank - t.rank `change`
FROM ranks_today t, users u
WHERE u.id = t.id;
원하는 경우 선택적으로 사용자 테이블에
rank
및
previous_rank
열을 만들 수
및 업데이트 여기
3 단계에서 사람들은 쿼리의 샘플 출력입니다 :
name rank previous_rank change
---- ---- ------------- ------
Fred 1 2 1
Betty 2 5 3
Barney 3 3 0
Bam Bam 4 1 -3
Wilma 5 4 -1
좋은 생각,하지만 난 싶지 꽤 무엇 : I 효율적으로 능력을 필요로하는 순위 F를 표시하지 않습니다 rom 전날,하지만 전능 능력을 필요로 효율적으로 현재 순위와 함께 "순위 변경"전날합니다. – Jonah
@all 같은 점수를 가진 여러 사용자가있을 때 어떻게 처리할까요? – ajreal
동일한 포인트 값을 가진 사용자는 작은 스패너를 작품에 추가합니다. OP는 순위를 결정해야하는 순서를 결정해야합니다. 순위를 계산할 때 한 가지 해결책은'ORDER BY' 절에 추가 열을 추가하는 것입니다. 따라서 순위는 점 이상으로 결정됩니다. (즉, 'ORDER BY points, last_name ...'또는 'ORDER BY points, most_recent_points_awarded_datetime ...') – JYelton