0

以下のクエリは、スコアによる通常のユーザーのランキングにはクールですが、テーブル内の同じスコアに対して同じランク結果のクエリが必要です

SET @rank = 0;
SELECT * FROM (
    SELECT @rank:=@rank + 1 AS rank,score, user_id FROM site_crossword_members ORDER BY score DESC 
) as tmp; 

ありがとう

4

2 に答える 2

2

指定されたクエリが正しく機能することを確信していますか? ORDER BYの後に完了することを思い出しSELECTます。したがって、ランクを並べ替えID ASCまたは類似させます。

SELECT user_id, 
    CASE WHEN @score != score THEN @rank := @rank + 1 ELSE @rank END AS rank,
    @score := score AS dummy_value
FROM (  SELECT score, user_id
        FROM site_crossword_members, 
            (SELECT @rank := 0, @score := NULL) AS vars
        ORDER BY score DESC) AS h

短縮版:

SELECT user_id, 
    @rank := @rank + (@score != score) AS rank,
    @score := score AS dummy_value
FROM (  SELECT score, user_id
        FROM site_crossword_members, 
            (SELECT @rank := 0, @score := NULL) AS vars
        ORDER BY score DESC) AS h
于 2012-11-15T08:06:22.627 に答える
2

このクエリを試してください (変数を含むバージョン) -

SET @rank = 0;
SET @score = NULL;

SELECT
  rank, score, user_id
FROM (
  SELECT
    score,
    user_id,
    IF(@score = score, @rank := @rank + 1, @rank := 1) AS rank,
    @score := score
  FROM site_crossword_members
  ORDER BY score DESC
) t;
于 2012-11-15T08:06:42.980 に答える