2

重複の可能性:
MySQL は ORDER BY で行の位置を取得
します PHP/MySQL でのランクの計算

私はphpで書かれたゲームシステムを持っています.各ユーザーはXの金額を持っています. サイトで最もリッチなユーザーを表示するページがあります。

$ranking = mysql_query("
    SELECT * 
    FROM users 
    ORDER BY money DESC 
    LIMIT 10
");

ここで、各ユーザーにリスト内の自分の位置を与えたいと思います。すべての情報を選択して、1 つの値を取得するためだけに並べ替えを開始することはできません。リソースの無駄です。行の位置 (userid = X) を選択するにはどうすればよいですか?

(MYSQL)

4

3 に答える 3

1

相関サブクエリを使用してこれを行う簡単で標準的な方法を次に示します。

SELECT *, (SELECT count(*) + 1 FROM users WHERE money > u.money) as MoneyRank
FROM users AS u
WHERE username = 'X'

ここにSqlFiddle のデモがあります。

ただし、これは、 「三角結合」 (SQL Server の記事ですが、それでも適用されます) と同様に、パフォーマンスの問題に悩まされます。最初はこの方法で自分で実装し(簡単です)、パフォーマンスの問題がある場合はインデックスを作成し、それが十分でない場合は、事前に計算された/キャッシュされた他のオプションに進みます。コメントには、機能する他のソリューションについても言及されています。

于 2012-10-30T20:46:30.723 に答える
0

Rank列はリスト内の位置になります。

SELECT t.*, 
   @rownum := @rownum + 1 AS rank
FROM users, (SELECT @rownum := 0) r
ORDER BY money DESC 
LIMIT 10
于 2012-10-30T17:58:02.253 に答える
0

テーブル全体の並べ替えを行わないと、これを簡単かつ迅速に行うことはできません。各人に定期的 (おそらく 1 時間ごと) にのみ新しいランクを与え、その方法で位置を更新することをお勧めします。

「リーダーボード」の場合、常にオフセットと制限の制限があるため、この問題に遭遇することはありません。したがって、トップ 10 (限定) を表示すると、1 ~ 10 のランクがわかります。

ただし、個々のユーザーを選択するだけでは、非常に非効率なテーブルの並べ替えなしでは実行できません。

また、この他の質問を参照してください (ほぼ正確に重複していると思いますか?)

PHP/MySQL でランクを計算する

于 2012-10-30T18:02:35.643 に答える