mysql - 根据表的其余部分计算单行的排名

标签 mysql ranking

我有一个用户资料表和一个提示表。 tips 表有一个外键,将用户 ID 链接到 tip.receiver。我需要能够根据收到的提示对用户进行排名。据我了解,MySQL 没有 RANK() 函数。选择多行时,您可以相当简单地进行替换,如图所示 here :

SELECT    id,score,
          @curRank := @curRank + 1 AS rank
FROM      scores p, (SELECT @curRank := 0) r
ORDER BY  score DESC;

但是,我希望能够在仅选择一行时显示排名。例如,在查看用户的个人资料页面时。我考虑过为此使用子查询,但有更好的方法吗?

最佳答案

您有几个选择。首先,您可以使用您已经确定的子查询方法,这在性能方面不太理想,即

SELECT
    d.id,
    d.score,
    d.rank
FROM (
    SELECT    
        p.id,
        p.score,
        @curRank := @curRank + 1 AS rank
    FROM      scores p, (SELECT @curRank := 0) r
    ORDER BY  p.score DESC
) d
WHERE d.id = 12345;

或者,您可以在用户表中添加一个额外的列,然后执行 INSERT ... ON DUPLICATE KEY UPDATE 以缓存排名值,然后从用户表中选择与您想要的用户相对应的行喜欢。下面是 INSERT 查询的示例

INSERT INTO usersTable (
    id,
    cachedRank
)
SELECT
    d.id,
    d.rank
FROM (
    SELECT    
        p.id,
        p.score,
        @curRank := @curRank + 1 AS rank
    FROM      scores p, (SELECT @curRank := 0) r
    ORDER BY  p.score DESC
) d
ON DUPLICATE KEY UPDATE
    cachedRank = VALUES(cachedRank);

从长远来看,这会更有效率。例如,您可以将其放入存储过程并使用 MySQL 事件调度程序对其进行调度。此外,可以将查询调整为 INNER JOIN 到外部选择中的用户表)只是为了确保它只更新记录而不是插入任何新记录(在外键不一致的情况下)

关于mysql - 根据表的其余部分计算单行的排名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24545270/

相关文章:

mysql - 我的查询在 mysql 中工作,但不适用于 laravel eloquent

c# - 关键词排序算法

基于几个变量的排名

python - sklearn 中 nDCG 的输入

sql - 选择排名靠前的重叠段 SQL

php - 在基本的 mysql 搜索引擎中按相关性排序

C# - 为什么我的服务器计算机上的 MySQL 服务器很慢?

mysql ORDER BY with CASE - 太慢,更快的方法?

php - 无法使用php上传图片

php - 我想就 Paypal 表格征求专家的意见