sql >> データベース >  >> RDS >> Mysql

関係のある単純なMySQL更新ランク

    別の解決策は次のとおりです。ランクをまったく保存しないでください。 :-)

    その場で計算できます。

    例:

    SELECT id, (@next_rank := IF(@score <> score, 1, 0)) nr, 
               (@score := score) score, (@r := IF(@next_rank = 1, @r + 1, @r)) rank 
    FROM rank, (SELECT @r := 0) dummy1
    ORDER BY score DESC;
    

    結果:

      +------+----+-------+------+
      | id   | nr | score | rank |
      +------+----+-------+------+
      |    2 |  1 |    23 |    1 |
      |    4 |  1 |    17 |    2 |
      |    1 |  0 |    17 |    2 |
      |    5 |  1 |    10 |    3 |
      |    3 |  1 |     2 |    4 |
      +------+----+-------+------+
    

    nr これは、次のランクを割り当てる必要があるかどうかを示す補助列です。

    このクエリを別のselectでラップできます たとえば、ページングを実行します。

    SELECT id, score, rank 
    FROM (SELECT id, (@next_rank := IF(@score <> score, 1, 0)) nr, 
               (@score := score) score, (@r := IF(@next_rank = 1, @r + 1, @r)) rank
          FROM rank, (SELECT @r := 0) dummy1
          ORDER BY score DESC) t
          WHERE rank > 1 and rank < 3;
    

    結果:

      +------+-------+------+
      | id   | score | rank |
      +------+-------+------+
      |    4 |    17 |    2 |
      |    1 |    17 |    2 |
      +------+-------+------+
    

    注意 :今からrank は計算列であるため、インデックスを作成してデータセットに効率的にページングすることはできません(つまり、「ランクが3000から3010のレコードを選択してください」)。ただし、「上位Nランクを選択」する場合は引き続き有効です(対応するLIMITを設定する必要があります)。 クエリで)



    1. MySQLで数値を含まない値を検索する

    2. PDObind_paramは未定義のメソッドです

    3. MySQLで日時またはタイムスタンプのデータ型を使用する必要がありますか?

    4. UTC_DATEの例– MySQL