1

私はリーダーボードを実装する方法に取り組んでいます。私がやりたいことは、いくつかの異なるフィルター(スコア、提出数、平均)でテーブルをソートできるようにすることです。テーブルは次のようになります。

+--------+-----------------------+------+-----+---------+-------+
| Field  | Type                  | Null | Key | Default | Extra |
+--------+-----------------------+------+-----+---------+-------+
| userID | mediumint(8) unsigned | NO   | PRI | 0       |       |
| score  | int                   | YES  | MUL | NULL    |       |
| numSub | int                   | YES  | MUL | NULL    |       | 
+--------+-----------------------+------+-----+---------+-------+

そして、次のようなデータのサンプルセット:

+--------+----------+--------+
| userID | score    | numSub |
+--------+----------+--------+
| 505610 | 1245     | 2      |    
| 544222 | 1458     | 2      |
| 547278 | 245      | 1      |
| 659241 | 12487    | 8      |
| 681087 | 5487     | 3      |
+--------+----------+--------+

私のクエリは PHP から来ます。

// get the top 100 scores
$q = "select userID, score from table order by score desc limit 0, 100";

これは、最初に並べ替えられたユーザー ID/スコアのセットを返します。また、numSub (送信数) で並べ替えるクエリもあります。

私が望むのは、score/numSub である平均スコアでテーブルをソートすることです。テーブルは大きくなる可能性があるため、効率が重要です。

前もって感謝します!

4

2 に答える 2

2

効率が重要な場合は、列を追加しavgscoreて の値を割り当てますscore/numsub。次に、列にインデックスを作成します。

挿入/更新トリガーを使用して、行が追加または変更されたときに自動的に平均計算を行うことができます。

テーブルが大きくなると、並べ替えにかなりの時間がかかります。

于 2013-05-09T16:14:34.980 に答える
1

私の知る限り、これ以上複雑にする理由はありません。

SELECT userID, score/numsub AS average_score
FROM Table1 
ORDER BY score/numsub DESC;
于 2013-05-09T16:11:35.000 に答える