2011-08-10 2 views
1

나는 전날보다의 순위가 변경된 과 함께 각 사용자 순위를 표시하는 리더 보드를 설계하고 있습니다. 순위는 단순히 사용자에게 points 열을 주문하면 알 수 있습니다.MySQL : 필드를 다음 절의 위치로 설정하십시오.

전날의 순위 변화를 확인하려면 매일 자정에 사용자 순위를 저장하는 cron 작업을해야한다고 생각합니다.

하나의 SQL 쿼리 만 사용하려면이 cron 작업을 작성할 수 있습니까? previousRank 열에 모든 사용자의 순위를 저장하는 쿼리를 디자인해야합니다. 어떤 도움이 필요합니까? PHP로 각 행을 처리 할 필요가없는 일정한 쿼리에서이 작업을 수행하고 싶습니다.

답변

3

나의 제안 :

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; 
원하는 경우 선택적으로 사용자 테이블에 rankprevious_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 
+0

좋은 생각,하지만 난 싶지 꽤 무엇 : I 효율적으로 능력을 필요로하는 순위 F를 표시하지 않습니다 rom 전날,하지만 전능 능력을 필요로 효율적으로 현재 순위와 함께 "순위 변경"전날합니다. – Jonah

+0

@all 같은 점수를 가진 여러 사용자가있을 때 어떻게 처리할까요? – ajreal

+0

동일한 포인트 값을 가진 사용자는 작은 스패너를 작품에 추가합니다. OP는 순위를 결정해야하는 순서를 결정해야합니다. 순위를 계산할 때 한 가지 해결책은'ORDER BY' 절에 추가 열을 추가하는 것입니다. 따라서 순위는 점 이상으로 결정됩니다. (즉, 'ORDER BY points, last_name ...'또는 'ORDER BY points, most_recent_points_awarded_datetime ...') – JYelton

관련 문제