【问题标题】:SQL Sorting AlgorithmSQL 排序算法
【发布时间】:2011-07-02 03:08:05
【问题描述】:

我有下表:

| WinnerID | LoserID |

它描述了两个竞争对手之间的比赛结果。 目前,我有以下查询来生成高分:

SELECT WinnerID 
FROM KomperResult 
GROUP BY WinnerID 
ORDER BY COUNT(LoserID) DESC LIMIT 10;

如果结果是:

| WinnerID | LoserID |
     1          2
     1          3
     4          1

最高分是:

 1
 4

但我希望它是:

 4
 1

生成高分的更好算法/查询是什么?

【问题讨论】:

  • 第 1 队比第 4 队获胜的次数更多。为什么第 4 队应该排在榜首?
  • 您需要添加更多关于如何查看高分的详细信息。例如:WinnerID 记录的数量如何影响结果? WinnerID 如何影响结果?具体来说,为什么 4,1 比 1,4 更好?是按 WinnerID 降序排列的简单排序还是更复杂的排序?
  • 看起来 4,1 比 1,4 好,因为 ID 4 在 4 和 1 之间的直接比赛中战胜了 ID 1。@SuprDewd:这是你想要的吗?
  • 是的,bw_uezi。但我认为我通过 Kris Babic 的答案的变体解决了这个问题。

标签: sql sorting


【解决方案1】:

从您的帖子和 cmets 看来,您正试图根据个人比赛的结果创建一个排名系统。对于简单的场景,例如您描述的场景,可以创建一个返回预期结果的查询。但是,随着您获得更多用户的更多结果,不同场景的数量和所需的计算可能会变得更加复杂。

看看 Chess 使用的Elo Ranking System 在一对一比赛中创建个人之间的排名可能会有所帮助。这是一个网站,它提供了一个相当不错的计算工作示例:Elo Introduction(解释为用于围棋锦标赛)。

为了创建任何类型的排名系统,您需要清楚地列出所有会影响整体排名的规则/逻辑。如果没有完整的列表,则无法完全清除完整的算法。

【讨论】:

    【解决方案2】:

    那么,为什么不按其他方式排序呢?

    SELECT WinnerID 
    FROM KomperResult 
    GROUP BY WinnerID 
    ORDER BY COUNT(LoserID) ASC LIMIT 10;
    

    尚未验证

    这里的问题是,您按 LoserID 排序,但您只需要 WinnerID。如果您确切地知道自己想要什么,那么这些数据可能是有意义的,但对我来说这似乎不是最好的方法。

    【讨论】:

      猜你喜欢
      • 2011-12-10
      • 1970-01-01
      • 2020-11-12
      • 1970-01-01
      • 2011-05-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多