2012-05-01 82 views
3

問題
我有四個遊戲服務器正在收集數據。將數據放入單個表中。不幸的是,這會導致一名球員的每個數據有四項。SQL查詢:在一個語句中使用DISTINCT/UNIQUE和SUM()

我想要什麼
我想在某些列上有一條記錄和SUM()。

我會發表一條我寫的聲明不起作用,但您會明白我想完成的事情。

SELECT DISTINCT(Name), 
       Max(Level), 
       Class, 
       Sum(Kills), 
       Sum(Deaths), 
       Sum(Points), 
       Sum(TotalTime), 
       Sum(TotalVisits), 
       CharacterID 
FROM Characters 
WHERE Name LIKE '$value%' 
     OR CharacterID LIKE '$value' 
ORDER BY Name ASC; 
+2

重複行通常表示系統架構存在問題。您可能想重新考慮如何處理並行服務器。 –

回答

5

讓我開始說,數據庫中的重複行真的不太理想。數據庫使數據更易於操作,而不會隨機出現異常情況。

但是,爲了回答你的問題,這簡直是什麼dweiss所說的投入代碼(使用group by):

SELECT 
    name, 
    MAX(Level), 
    Class, 
    SUM(Kills), 
    SUM(Deaths), 
    SUM(Points), 
    SUM(TotalTime), 
    SUM(TotalVisits), 
    CharacterID 
FROM 
    Characters 
WHERE 
    Name LIKE '$value%' OR CharacterID LIKE '$value' 
GROUP BY 
    name, 
    class, 
    characterid 
ORDER BY 
    Name ASC 
; 

我假設姓名,班級,或CharacterId,都是每個球員一樣,因爲那是獲得那些價值的唯一方法。否則,你也必須在它們上使用聚合函數。

+2

謝謝,我承認StackedOverflow的風格愚蠢。 OP - Tim在這裏絕對是正確的,指出規範化的數據庫將使事情變得更容易,幾乎總是更加優化。目前,Tim寫的查詢應該沒有任何缺陷,但是你可能想了解更多關於SQL的內容,並且可能花費一些時間繪製出一個模式 - 這對確保有幫助。 – dweiss

+0

該查詢的作品,偉大的傢伙讚賞和感謝的經驗教訓。我現在面臨的問題是查詢適用於phpmyadmin,但在網頁上......我第一次碰到這個,任何經驗,將不勝感激。 – Andrew

+0

@Andrew我不確定。如果你打開一個新的StackOverflow問題並且完整地解釋你的問題,這可能是最好的。 –

5

而不是使用不同的,你可以通過你的非彙總資料欄組(即姓名,班級,或CharacterId)。這樣你就可以使用你的聚合:最大值,總和,你仍然會有你獨特的角色!

+0

我會給你投票,但我需要15個代表:) 謝謝! – Andrew

+0

謝謝!使用Tim在上面寫出的查詢,但請考慮他和我的意見。 – dweiss

+0

@ user1366982此外,如果您發現dweiss的回答最有用,您可以通過點擊綠色複選標記給他接受的答案。 –