【问题标题】:Mysql sorting byMysql 排序方式
【发布时间】:2013-05-04 04:31:05
【问题描述】:

我正在研究如何实施排行榜。我想做的是能够通过几个不同的过滤器(分数、提交次数、平均值)对表格进行排序。该表可能如下所示。

+--------+-----------------------+------+-----+---------+-------+
| 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 的平均分数对表格进行排序;桌子可能很大,所以效率对我来说很重要。

提前致谢!

【问题讨论】:

    标签: mysql sorting optimization leaderboard


    【解决方案1】:

    如果效率很重要,那么添加一列avgscore 并为其分配score/numsub 的值。然后,在列上创建一个索引。

    您可以使用插入/更新触发器在添加或修改行时自动进行平均计算。

    一旦您的表变大,排序将花费大量时间。

    【讨论】:

      【解决方案2】:

      据我所知,没有理由让它比这更复杂;

      SELECT userID, score/numsub AS average_score
      FROM Table1 
      ORDER BY score/numsub DESC;
      

      【讨论】:

      • 如何返回实际平均值而不是分数?
      • @vbbartlett 用那个改变更新了答案。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-13
      • 1970-01-01
      相关资源
      最近更新 更多