PHP/MySQL 按多列排名
PHP/MySQL Rank by multiple columns
我正在开发一款以 2 种不同方式为玩家评分的游戏,A、B。
在这个游戏中,我有一个排名页面,显示您在排名 A、B 和 A+B 中的位置,以及按 A+B 排序的玩家列表。
在这些不同的评分情况下检索您的排名以及排名 A+B 的附近用户(显示在列表中)的最有效方法是什么?
我假设我必须至少对每个用户进行一次传递。我应该尝试使用多个左连接和子选择并计算分数 A/B/A+B 大于您的用户,还是只查询整个用户+分数列表并使用 PHP 函数计算排名?
示例:
UID | A | B
----------------
1 | 100 | 50
2 | 150 | 20
3 | 10 | 100
假设查看排名的用户是 UID=2 我们应该看到:
得分列表(A+B):
2 - 170
1 - 150
3 - 110
你在分数 A 中 #1。
你在分数 B 中是 #3。
你在分数 A+B 中是 #1。
create table my_table
(UID int not null auto_increment primary key
,A int not null
,B int not null
);
insert into my_table values
(1,100,50),
(2,150,20),
(3,10,100);
SELECT uid
, FIND_IN_SET(a,a_score) a_rank
, FIND_IN_SET(b,b_score) b_rank
, FIND_IN_SET(a+b,ab_score)ab_rank
FROM my_table
, ( SELECT GROUP_CONCAT(DISTINCT a ORDER BY a DESC) a_score
, GROUP_CONCAT(DISTINCT b ORDER BY b DESC) b_score
, GROUP_CONCAT(DISTINCT a+b ORDER BY a+b DESC) ab_score
FROM my_table
) n
[WHERE uid=2];
+-----+--------+--------+---------+
| uid | a_rank | b_rank | ab_rank |
+-----+--------+--------+---------+
| 1 | 2 | 2 | 2 |
| 2 | 1 | 3 | 1 |
| 3 | 3 | 1 | 3 |
+-----+--------+--------+---------+
我正在开发一款以 2 种不同方式为玩家评分的游戏,A、B。 在这个游戏中,我有一个排名页面,显示您在排名 A、B 和 A+B 中的位置,以及按 A+B 排序的玩家列表。
在这些不同的评分情况下检索您的排名以及排名 A+B 的附近用户(显示在列表中)的最有效方法是什么?
我假设我必须至少对每个用户进行一次传递。我应该尝试使用多个左连接和子选择并计算分数 A/B/A+B 大于您的用户,还是只查询整个用户+分数列表并使用 PHP 函数计算排名?
示例:
UID | A | B
----------------
1 | 100 | 50
2 | 150 | 20
3 | 10 | 100
假设查看排名的用户是 UID=2 我们应该看到:
得分列表(A+B):
2 - 170
1 - 150
3 - 110
你在分数 A 中 #1。
你在分数 B 中是 #3。
你在分数 A+B 中是 #1。
create table my_table
(UID int not null auto_increment primary key
,A int not null
,B int not null
);
insert into my_table values
(1,100,50),
(2,150,20),
(3,10,100);
SELECT uid
, FIND_IN_SET(a,a_score) a_rank
, FIND_IN_SET(b,b_score) b_rank
, FIND_IN_SET(a+b,ab_score)ab_rank
FROM my_table
, ( SELECT GROUP_CONCAT(DISTINCT a ORDER BY a DESC) a_score
, GROUP_CONCAT(DISTINCT b ORDER BY b DESC) b_score
, GROUP_CONCAT(DISTINCT a+b ORDER BY a+b DESC) ab_score
FROM my_table
) n
[WHERE uid=2];
+-----+--------+--------+---------+
| uid | a_rank | b_rank | ab_rank |
+-----+--------+--------+---------+
| 1 | 2 | 2 | 2 |
| 2 | 1 | 3 | 1 |
| 3 | 3 | 1 | 3 |
+-----+--------+--------+---------+