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 - 从其他表中计算排名的主要内容,如果未能解决你的问题,请参考以下文章