2015-03-24 31 views
1

我正在开发一个游戏,玩家的分数在两种不同的方式,A,B。 在这场比赛中我有一个排名页面,显示你是在排名A,B和A的什么位置+ B以及A + B订购的玩家列表。PHP/MySQL的排名由多个列

什么是最有效的方式来获取这些不同的评分情况的排名,以及附近的用户为等级A + B(显示在列表上)?

我想我会做一个传过来的每个用户至少一次。我应该尝试使用多个左连接和子查询,并计算比A/B/A + B大得多的用户,或者只查询整个用户+分数列表并用PHP函数计算排名?

实施例:

UID | A | B 
---------------- 
1 | 100 | 50 
2 | 150 | 20 
3 | 10 | 100 

假设用户观看的排名是UID = 2,我们将看到:

SCORE LIST(A + B):
2 - 170
1 - 150
3 - 110

您是#1在分数A.
您是#3在分数B.
您是#1在分数A + B

+1

你可以添加示例数据和预期的输出? – 2015-03-24 23:14:35

+0

编辑例如数据和输出 – 2015-03-24 23:46:11

回答

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 | 
+-----+--------+--------+---------+ 

http://sqlfiddle.com/#!9/97da6/13

+0

谢谢。我可能应该在另一个问题中提出这个问题,但加载得分列表的最佳方式是什么(按照我的示例输出的第1部分)? 考虑到表可能有〜10000行,是不是一次拉出所有记录太重了,或者有什么方法可以将结果存储在另一个表中并根据需要进行延迟加载?这需要计算出的等级表在每次发生分数变化时被删除/更新。我只是不确定如何告诉“如果你想拉分数/等级,检查他们是否已经计算出来,否则,再次计算它们”。 – 2015-03-25 15:00:10

+0

吸取它并看到,但我可能会将整个东西写入外部json文件并通过一些JavaScript调用它。我无法详细说明这一点,因为这不是我的特长。 – Strawberry 2015-03-25 17:39:55