MySQL - 计算其他表的排名

时间:2016-04-27 02:54:46

标签: mysql sql database query-optimization

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

-------- users
Name                    |   Type
------------------------|----------------
uuid                    |   VARCHAR(36)
name                    |   VARCHAR(255)
...                     |   ...
-------- scores
Name                    |   Type
------------------------|----------------
uuid                    |   VARCHAR(36)
user_uuid               |   VARCHAR(36)
score                   |   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];

但是现在,我该如何获取用户的排名?也就是说,排名由他们的分数与每个其他用户的分数决定。

是否真的有必要遍历每一个user,计算他们的所有分数,然后命令他们的分数来确定一个用户的等级?即时执行此查询似乎很费劲,特别是如果我有大量用户。我是否应该构建一个单独的rankings表,并在每次INSERT后将表重新排序到scores表中?这看起来并不理想。

我还有另一个需要动态排名的应用程序,但计算要严格得多:用户score由至少5个不同表格的复杂算法决定。所以我真的需要对数据库排名有一些了解 - 虽然上述问题是一种简单的方法来表示它。有哪些好的做法需要考虑?

1 个答案:

答案 0 :(得分:2)

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

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