2015-03-24 51 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