2013-12-20 62 views
0

enter image description here高級排序MySQL的,排序上的動作ID

我需要排序的actionName(這是從動作表取回和還包含一個ID)此表。然而,一些球員可能沒有針對特定actionName任何記錄在這個截圖

enter image description here

我已經完成,以得到它顯示的第一個結果看到的,但是我對如何我可以使它不知道例如,每殺或贏,它應該總是分組用戶名,因爲我需要結果集顯示在一個表中,但最高殺死率最高的玩家。我也需要顯示其他相應的表,而不必執行很多查詢。

這是我使用實現第一個結果集

SELECT 
    p.playerName, 
    a.actionName, 
    a.id as actionId, 
    SUM(a.id) AS amount, 
    pa.timestamp 
FROM playeraction pa 
LEFT JOIN action a ON a.id = pa.action_id 
INNER JOIN player p 
    ON p.id = pa.player_id 
GROUP BY 
    pa.player_id, 
    pa.action_id 
ORDER BY 
    p.playerName, 
    amount DESC 

回答

0

你可以做一種觀點認爲,將集團由玩家名稱,然後在該記錄的單獨的列數殺的sql,爭取和死亡人數分別。這樣你就可以爲每個動作設置特定的列,如果用戶有這樣的動作,它就不會打擾你。列值將只是0,因爲沒有記錄被發現加和。這也將解決順序問題,因爲你將能夠在每列命令:

ORDER BY KillCount, WinCount, DeathCount 

在這種情況下,雖然你將不得不修改視圖如果您需要創建新的動作。

另外,你爲什麼總結a.Id?你不是指數?

編輯:你也可以從Action表中選擇,然後加入PlayerAction表,對於每個動作你將有一個行動記錄。例如:

SELECT 
a.Id, a.ActionName, 
p.Name, 
pa.Amount, pa.TimeStamp 
FROM Actions a 
LEFT JOIN Players p on 1 = 1 
LEFT JOIN PlayerActions pa on pa.ActionId = a.Id 
GROUP BY 
... 
ORDER BY 
... 

只有這樣你才需要通過某種遊戲比賽ID來過濾掉玩家。

然後有一個選項可以在接收到查詢結果時計算應用程序中的實際結果。這也適用於您的查詢。

+0

是的你是正確的,它可以是COUNT(a.id),爲列,我試圖將行動列名轉移到列,但我不知道如何做到這一點,MySQL不支持樞軸查詢,我也會喜歡它是動態的,所以我可以添加更多的行動在未來沒有修改代碼 –

+0

看看編輯:) –

+0

但是玩家不會被捆綁在一起了嗎? –