【问题标题】:SQL query for sorting leaderboard用于排序排行榜的 SQL 查询
【发布时间】:2013-04-12 20:58:36
【问题描述】:

如果我们有表格,对排行榜最有效的 SQL 查询是什么:

[UserID], [Points]

我想让结果按点和排名列排序。

【问题讨论】:

  • 你用 MySQL 和 SQL Server 标记了这个。请通过添加适当的标记(Oracle、SQL Server、MySQL 等)来指定您要定位的 RDBMS。可能有一些答案利用了不受普遍支持的语言或产品功能。此外,通过使用特定的 RDBMS 对其进行标记,您的问题可能会受到更适合回答的人的关注。

标签: mysql sql sql-server sql-server-2008 tsql


【解决方案1】:

这是一个利用 join 的解决方案:

SELECT t1.UserID, t1.Points, COUNT(t2.Points) AS Rank
FROM LeaderBoards t1
JOIN LeaderBoards t2 ON t1.Points < t2.Points OR (t1.Points=t2.Points and t1.UserID = t2.UserID)
GROUP BY t1.UserID, t1.Points
ORDER BY t1.Points DESC, t1.UserID DESC;

我在 MySQL 上对此进行了测试。有关这方面的更详细的文章,请参阅: http://www.artfulsoftware.com/infotree/qrytip.php?id=460

【讨论】:

    【解决方案2】:

    在 SQL Server 2008 中,您可以使用Ranking functions

    SELECT UserId,
           Points,
           RANK() OVER(ORDER BY Points DESC) AS Rank
    FROM LeaderBoards
    ORDER BY Points DESC
    

    A MySql rank could be something like this:

    SELECT UserId,
           Points,
           @curRank := @curRank + 1 AS Rank
    FROM LeaderBoards l, (SELECT @curRank := 0) r
    ORDER BY Points DESC
    

    【讨论】:

    • 按点 DESC 排序 - 更有可能? :)
    • 我查询 #1 的性能是否足以处理 1kk 条记录?
    【解决方案3】:

    查询应该是:

    SELECT UserID, Points FROM table ORDER BY Points

    在您使用的任何显示技术(例如 php 等)中生成排名列可能更容易。它可以在大多数 SQL 风格中完成,但语法会有所不同。

    【讨论】:

    • 谢谢,事实上,通过 Nenad Zivkovic 的查询,我将获得 Rank 列,这绝对是我需要的
    猜你喜欢
    • 1970-01-01
    • 2020-05-26
    • 2021-07-06
    • 1970-01-01
    • 1970-01-01
    • 2020-07-11
    • 2015-11-22
    • 1970-01-01
    • 2021-05-27
    相关资源
    最近更新 更多