1792 번 글의 답장글: Re: Re: Re: mysql 에서 랭킹순위를 바로 업데이터하는방법?? |
글쓴이: 산이
[홈페이지]
|
글쓴날: 2003년 11월 28일 00:07:44 금(새벽) |
조회: 4183 |
[고재두]님이 남기신 글:
>
>[산이]님이 남기신 글:
>
>>
>>[고재두]님이 남기신 글:
>>
>>>안녕하세요. 또왔어요... ㅡㅡ.
>>>mysql 데이터 처리에 궁금한 사항이 있어 문의
드립니다.
>>>점수를 기준으로 한 랭킹 DB 를 만들려고 합니다..
>>>특정 사용자의 랭킹이 몇인지를 항상 업데이터 해야 하는
부분에서
>>>구조적인 기술이 필요하여 문의 드립니다..
>>>
>>>일단 TEST 라는 샘플 테이블구조는...
>>>-------------------------------------
>>>NUM | NAME | POINT | RANK
>>>-------------------------------------
>>>1 | 테스트1 | 10 | 5
>>>2 | 테스트2 | 20 | 4
>>>3 | 테스트3 | 50 | 3
>>>4 | 테스트4 | 70 | 2
>>>5 | 테스트5 | 90 | 1
>>>-------------------------------------
>>>테이블 구조가 위와 같다면...
>>>
>>>출력시 테스트2 라는 사용자의 랭킹은 4입니다만..
>>>이때는 간단히 (select rank from test where name='테스트2') 로 확인
할수 있겠죠?
>>>그런데....
>>>테스트3 유저의 포인트 점수가 50에서 60 또는 70 으로
업데이트 되었을 경우..
>>>랭킹이 바뀌어야 하는데..
>>>이것을 포인트가 바뀌는 즉시 바로 수정된 랭킹을 볼수 있는
방법이 없을까요?
>>>
>>>제가 생각하기에는 전체적인 랭킹을 갱신을 한다음에 셀렉트
하는방법 밖에 모르겠네요 ㅡㅡ.
>>>그렇게 되면 사용자가 만명 이상 넘어가면 갱신하는데만도
속도가 엄청 느려서리 ㅡㅡ.
>>>
>>>랭킹 테이블을 따로 떼어서 처리 한다던가 하는 좋은 방법이
없을까요?
>>
>>========================================
>>
>>랭킹은 실시간 업데이트 랭킹과 일정 기간을 두고 한번만
업데이트하는
>>랭킹이 있습니다.
>>
>>위의 질문은 전자의 경우이네요.
>>
>>이와 같은 경우는 게시판의 정렬 인덱스를 업데이트하는
것과
>>거의 동일한 알고리즘입니다.
>>
>>>테스트3 유저의 포인트 점수가 50에서 60 또는 70 으로
업데이트 되었을 경우..
>>
>>만약 50 -> 60 포인트로 올라간다고 하면,
>>
>>0. '현재나의랭킹'을
구합니다.
>>
>>1. 포인트가 60 보다 큰 유저의 랭킹중에서 가장 작은 랭킹
값을 구합니다.
>>
>>SELECT 결과랭킹 FROM 테이블 WHERE 포인트 > 60 ORBER BY 랭킹 ASC LIMIT
1;
>>
>>위의 경우라면 가져온 랭킹 결과가 2 가 되겠죠
>>포인트가 바꾸었으므로 '테스트3' 의 랭킹은 `결과랭킹 + 1' 이
되겠죠.
>>(결과가 NULL 이라도 정수형으로 바꾸어 주는 트릭도
필요합니다.)
>>
>>바뀐 나의 랭킹 2 + 1 => 3 (`새로운랭킹')
>>
>>
>>2. 현재 나의 랭킹과 다른 사람의 랭킹을 업데이트
합니다.
>>
>>if(현재나의랭킹
!= 새로운랭킹) // 랭킹이 바뀌는 경우
>>{
>> ## 다른사람 랭킹 업데이트
>> ##
>> UPDATE 테이블 SET 랭킹 = 랭킹 + 1
>> WHERE 랭킹 > '결과랭킹' AND 랭킹 < '현재나의랭킹';
>>
>> ## 나의 랭킹 업데이트
>> ##
>> UPDATE 테이블 SET 랭킹 = 새로운랭킹 WHERE NAME =
'테스트3';
>>}
>>
>>
>>3. 끝
>>
>>회원수가 많아지면 어쩔 수없이 느려집니다.
>
>========================================
>
>아~~~~~~~!
>그런데.. 이걸로는 플그래밍 짜니 엄청 복잡해지는데..
ㅡㅡ.
>특히 포인터가 줄었을때(-)는 ??... ㅡㅡ..
>음.....
>더 쉬운 방법은 없는걸가요... 하~~~~
========================================
절대 복잡하지 않습니다..
(알고리즘의 기초라고 할까....)
## 새로운 랭킹 = 결과랭킹 + 1
##
if(현재나의랭킹
!= 새로운랭킹) // 랭킹이 바뀌는 경우
{
$addoper = 1; // 기본 연산은 `+', 랭킹이 올라가는 경우
if(현재나의랭킹
< 새로운랭킹) // 랭킹이 떨어지는 경우
{
$addoper = '-1';
}
$min = min(현재나의랭킹,
결과랭킹);
$max = max(현재나의랭킹,
결과랭킹);
## 다른사람 랭킹 업데이트
##
UPDATE 테이블 SET 랭킹 = 랭킹 + $addoper
WHERE 랭킹 > '$min' AND 랭킹 < '$max';
## 나의 랭킹 업데이트
##
UPDATE 테이블 SET 랭킹 = 새로운랭킹 WHERE NAME = '테스트3';
}
....
그외에 한방에 해결할 수 있는 방법은 있지만 별로 권장하질
않습니다.(회원수가
많아지면 속도 문제 발생됨)
SET @IDX=0;
UPDATE 테이블 SET 랭킹 = (@IDX:=@IDX+1) ORDER BY 포인터 DESC;
|
이전글 : Re: Re: mysql 에서 랭킹순위를 바로 업데이터하는방법??
다음글 : 싸부님~! 두개의 도메인의 동일 싸이트 접속시 문제 봉착입니다욧~!
|
from 61.254.74.228
JS(Redhands)Board 0.4 +@
|