MySQL - 从其他表中计算排名

Posted

技术标签:

【中文标题】MySQL - 从其他表中计算排名【英文标题】:MySQL - Calculate rank from other tables 【发布时间】:2016-04-27 02:54:45 【问题描述】:

我有一个users 表和一个scores 表:

--------用户
姓名 |类型
------------------------------------|----
uuid | VARCHAR(36)
姓名 | VARCHAR(255)
... | ...
-------- 分数
姓名 |类型
------------------------------------|----
uuid | VARCHAR(36)
用户uuid | VARCHAR(36)
分数 | INT(11)

我可以使用这样的子查询获取user,包括它们的总score

SELECT user.uuid, user.name,
(SELECT SUM(score) FROM scores WHERE user_uuid = user.uuid) AS score
FROM user WHERE user.uuid = [USER_UUID];

但是现在,我怎样才能获取用户的rank?也就是说,排名取决于他们的分数与其他所有用户的分数。

真的有必要遍历每个user,计算他们的所有分数,然后对他们的分数进行排序以确定单个用户的排名吗?即时执行此查询似乎很费力,尤其是在我有大量用户的情况下。我是否应该构建一个单独的 rankings 表,并在每次 INSERT 后将表重新排序到 scores 表中?这似乎也不理想。

我有另一个应用程序也需要即时排名,但计算要严格得多:用户的score 是由跨越至少 5 个不同表的复杂算法确定的。所以我真的需要对数据库排名有一些了解——尽管上述问题是一种简单的表示方法。有哪些好的做法需要考虑?

【问题讨论】:

请显示一些示例输入和预期输出。 你可以试试这个:row_number:=0; SELECT user_view.user_rank, user_view.uuid, user_view.name (SELECT (row_number:=row_number + 1) as user_rank, user.uuid, user.name, (SELECT SUM(score) FROM scores WHERE user_uuid = user.uuid) AS score FROM user, (SELECT @row_number:=0) AS t order by score) user_view;确保将 row_number 定义为数字。 【参考方案1】:

我认为将每个用户的排名保持在不同的表中(在将数据插入分数表时使用过程)会更好。这样您就可以在需要时立即获得排名。

在此链接中将标记视为正确答案。它可能会帮助你。 rank function in sql

【讨论】:

以上是关于MySQL - 从其他表中计算排名的主要内容,如果未能解决你的问题,请参考以下文章

mysql计算排名

MYSQL 仅在询问第一个排名时不会在 PHP 中返回结果

MySQL排名前n的排名和其他同组的总和

MySQL跨多列排名

按列值分组的列值更新mysql排名

MySQL select 语句 - 如何计算当前排名