【问题标题】:How to get row position? [duplicate]如何获得行位置? [复制]
【发布时间】:2012-10-30 17:54:15
【问题描述】:

可能重复:
MySQL get row position in ORDER BY
Calculating rank in PHP/MySQL

我有一个用php写的游戏系统,每个用户有X金额。 我的页面显示了网站中最富有的用户。

$ranking = mysql_query("
    SELECT * 
    FROM users 
    ORDER BY money DESC 
    LIMIT 10
");

现在我想给每个用户他在列表中的位置。 我不能选择所有信息并开始排序只是为了得到一个值,这是浪费资源。 如何选择行的位置(其中 userid = X)?

(MYSQL)

【问题讨论】:

  • @RedFilter,对不起,我不明白你的意思

标签: php mysql sql


【解决方案1】:

这是一种使用相关子查询的简单而标准的方法:

SELECT *, (SELECT count(*) + 1 FROM users WHERE money > u.money) as MoneyRank
FROM users AS u
WHERE username = 'X'

这是SqlFiddle demo

这确实会遇到性能问题,就像任何"triangular join"(SQL Server 文章,但仍然适用)一样,但是。我最初仍然会以这种方式自己实现它(这很简单),然后在存在性能问题时进行索引,如果这还不够好,则继续使用其他预先计算/缓存的选项。 cmets 还提到了其他可行的解决方案。

【讨论】:

    【解决方案2】:

    如果不进行全表排序,您将无法轻松/快速地做到这一点。我建议你只定期给每个人一个新的排名,也许每小时一次,并以这种方式更新他们的位置。

    对于“排行榜”,你不会遇到这个问题,因为你总会有偏移和限制的限制。所以当你显示前 10 名(有限)时,你就知道他们的排名是 1 - 10。

    但是,仅选择单个用户,如果没有高度无效的表排序,您将无法做到这一点。

    另外,请参阅另一个问题,哪个(我认为几乎完全重复?)

    Calculating rank in PHP/MySQL

    【讨论】:

    • 我不介意进行全表排序,但我想在资源中获取结果,而不是在 php 中排序。
    【解决方案3】:

    Rank 列将是列表中的位置:

    SELECT t.*, 
       @rownum := @rownum + 1 AS rank
    FROM users, (SELECT @rownum := 0) r
    ORDER BY money DESC 
    LIMIT 10
    

    【讨论】:

    • 我尝试编辑并添加我需要的 WHERE 子句,无论如何,它总是给我 1 而不是正确的位置。
    猜你喜欢
    • 2012-03-28
    • 1970-01-01
    • 2016-02-16
    • 1970-01-01
    • 2014-03-03
    • 2020-02-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多