PHP / MySQL ранжирование по нескольким столбцам

Я разрабатываю игру, в которой игроки получают два разных балла: 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

Вы # 1 в счете А.
Вы # 3 в счете Б.
Вы # 1 в счете 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 |
+-----+--------+--------+---------+

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

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]