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(提交数)排序

我想要的是按分数/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 回答