11

次の列を持つテーブルがあるとします。


p_id

ユーザーID

ポイント


これらの列に5000を超えるレコードがあるとします。つまり、実際にはポイントを持つユーザーがいます。各ユーザーには、ポイントレコードに固有の行があります。すべてのユーザーがどこかをクリックすることでWebサイトでポイントを獲得できると想像してみてください。彼らがクリックすると、私は彼らが得たポイントでデータベースを更新します。

つまり、ポイントを持っている人の5000以上のレコードを含むテーブルがありますよね?ここで、ポイント順に並べたい(降順)ので、MySQLクエリを実行すると、ポイントが最も多いユーザーがページの上部に表示されます。

これは、次のようなクエリを実行するだけで実行できます。

SELECT `p_id` FROM `point_table` ORDER BY `points` DESC

このクエリにより、すべてのレコードがポイントの降順で表示されます。

さて、ここで私の問題が発生します。今(注文されたとき)、各ユーザーに実際の場所を表示したいと思います。したがって、各ユーザーに次のようなものを提供したいと思います。「あなたは5374ユーザーのうち623ユーザーです」。問題は、その「623」番号を指定できないことです。

テーブルをポイント順に並べ替えるクエリを実行したいのですが、レコードがある行番号を「検索」またはカウントして、その値を返します。

誰かがこれのクエリを作成する方法を教えてもらえますか?それは本当に大きな助けになるでしょう。ありがとうございました。

4

4 に答える 4

16

この答えはあなたのために働くはずです:

SET @rank=0;
SELECT @rank:=@rank+1 AS rank, p_id FROM point_table ORDER BY points DESC;

更新:ポイントを更新して同じテーブルの追加の列に保存するときに、ランクの計算を検討することもできます。そうすれば、1人のユーザーを選択して、そのユーザーのランクを知ることもできます。何がより理にかなっていて、より良いパフォーマンスを発揮するかは、ユースケースによって異なります。

更新:コメントで解決した最終的な解決策は次のようになりました。

SELECT
rank, p_id
FROM
    (SELECT
     @rank:=@rank+1 AS rank, p_id, userid
     FROM
     point_table, (SELECT @rank := 0) r
     ORDER BY points DESC
    ) t
WHERE userid = intval($sessionuserid); 
于 2012-09-09T17:56:27.933 に答える
5

注文後の行番号

SELECT ( @rank:=@rank + 1) AS rank, m.* from                                   
(                            
  SELECT a.p_id, a.userid                                                   
  FROM (SELECT @rank := 0) r, point_table a 
  ORDER BY a.points DESC                                                     
) m
于 2019-09-18T17:48:41.440 に答える
0

何らかの理由で、受け入れられた回答が正しく機能しません。ID(主キー)で並べ替えて、「ORDERBY」ステートメントを完全に無視します。

代わりに私がしたことは:

SET @rn=0;
CREATE TEMPORARY TABLE tmp SELECT * FROM point_table ORDER BY points DESC;
SELECT @rn:=@rn+1 AS rank, tmp.* FROM tmp;
于 2021-02-21T07:31:29.110 に答える
-1

テーブルに位置の新しい列を追加します。cronジョブを定期的に実行して、すべてのテーブル行をポイント順に取得してから、whileループ内の位置でテーブルを更新します。

于 2012-09-09T18:02:01.393 に答える