복붙노트

[SQL] 가게 순위 위치로 MySQL의 업데이트 문

SQL

가게 순위 위치로 MySQL의 업데이트 문

나는 쿼리 주위에 내 머리를 얻으려고 난 그냥 그것을 알아낼 수 없습니다. 누군가가 나에게 포인터를 주면 내가 감사하겠습니다. 내가 달성하기 위해 노력하고있어 간단한 예를 들어, 나는 데이터베이스에 이러한 기록을 가지고

Score|Ranking
-------------
100  |0
200  |0
300  |0

그리고 나는 순위 필드는 결과가 있어야한다, 그래서 가장 높은 점수를 가지고 사람을 기준으로 1,2,3를 포함하고 싶습니다 :

Score|Ranking
-------------
100  |3
200  |2
300  |1

지금이 순간, 나는이 모든 레코드에 대해 다음 루프를하고 있지만, 실제로는 그 몇 천 될 수 있다고 주어진 해요 - 영원히 취할 수있는! 사람이 한 번에 이런 짓을 했을까 마법의 질의에 대한 아이디어가 있습니까?

해결법

  1. ==============================

    1.MySQL은, 당신은 ROW_NUMBER 사용할 수 있습니다.

    MySQL은, 당신은 ROW_NUMBER 사용할 수 있습니다.

    다음은 SELECT에서 사용의 예입니다 :

    select @rownum:=@rownum+1 ‘rank’, p.* 
    from player p, (SELECT @rownum:=0) r 
    order by score desc;
    

    이 같은 SELECT를 사용하여 INTO INSERT 경우에, 당신은 당신의 순위를 얻을 것이다.

  2. ==============================

    2.여기에 그것을 할 수있는 방법이있다 :

    여기에 그것을 할 수있는 방법이있다 :

    SET @r=0;
    UPDATE table SET Ranking= @r:= (@r+1) ORDER BY Score DESC;
    
    /* use this if you just want to pull it from the db, but don't update anything */
    SET @r=0;
    SELECT *, @r:= (@r+1) as Ranking FROM table ORDER BY Score DESC;
    
  3. ==============================

    3.이 변수의 @rc으로 증가하여 선수 순위가 인라인 업데이트 문을 작성합니다. 나는 그것이 잘 작동하고 DB 측에 모든 것을 유지, 매우 유사한 경우에 여러 번 사용했습니다.

    이 변수의 @rc으로 증가하여 선수 순위가 인라인 업데이트 문을 작성합니다. 나는 그것이 잘 작동하고 DB 측에 모든 것을 유지, 매우 유사한 경우에 여러 번 사용했습니다.

    SET @rc = 0;
    UPDATE players JOIN (SELECT @rc := @rc + 1 AS rank, id FROM players ORDER BY rank DESC)
    AS order USING(id) SET players.rank = order.rank;
    

    ID가 당신의 선수 테이블의 기본 키로 간주됩니다.

  4. ==============================

    4.

    SET @r = 0;
    UPDATE players JOIN (SELECT @r := @r + 1 AS rank, id FROM players ORDER BY rank DESC)
    AS sorted USING(id) SET players.rank = sorted.rank;
    
  5. ==============================

    5.나는 [간격 SQL 업데이트 기능] 당신에게 그 일을 내 방식을 보여주는거야

    나는 [간격 SQL 업데이트 기능] 당신에게 그 일을 내 방식을 보여주는거야

    고르다:

    set @currentRank = 0,
        @lastRating = null,
        @rowNumber = 1;
    select
        *,
        @currentRank := if(@lastRating = `score`, @currentRank, @rowNumber) `rank`,
        @rowNumber := @rowNumber + if(@lastRating = `score`, 0, 1) `rowNumber`,
        @lastRating := `score`
    from `table`
    order by `score` desc
    

    최신 정보:

    set @currentRank = 0,
        @lastRating = null,
        @rowNumber = 1;
    update 
        `table` r
        inner join (
            select
                `primaryID`,
                @currentRank := if(@lastRating = `score`, @currentRank, @rowNumber) `rank`,
                @rowNumber := @rowNumber + if(@lastRating = `score`, 0, 1) `rowNumber`,
                @lastRating := `score`
            from `table`
            order by `score` desc
        ) var on
            var.`primaryID` = r.`primaryID`
    set
        r.`rank` = var.`rank`
    

    나는 그것이 작동하는지 테스트를 제외하고이 일에 어떤 성능 검사를하지 않았다

  6. from https://stackoverflow.com/questions/3196971/mysql-update-statement-to-store-ranking-positions by cc-by-sa and MIT license