gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 03:00:26 25 4
gpt4 key购买 nike

我有一个用户资料表和一个提示表。 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com