2009-11-07 90 views
1

我工作的一個遊戲排行榜頁面上,我期待通過勝先訂購的排名,然後通過損耗(在具有相同數量的勝人情況下)選擇2 COUNT()的。下面的查詢工作正常,以便按順序列出一個列表,但我不知道如何將損失放入此查詢中。從MySQL查詢

SELECT username, COUNT(id) AS wins 
    FROM tblBattleHistory 
    WHERE battle_type = '0' && outcome = '1' 
    GROUP BY username 
    ORDER BY wins DESC 

結果='1'表示他們贏了,所以當結果='0'時,那意味着他們輸了。

回答

8

你可以這樣說:

SELECT username, SUM(outcome) AS wins, COUNT(*) - SUM(outcome) AS losses 
    FROM tblBattleHistory 
    WHERE battle_type = '0' 
    GROUP BY username 
    ORDER BY wins DESC, losses 
+0

看起來這應該工作。 +1 – 2009-11-07 23:38:45

+0

有聯繫嗎? – 2009-11-07 23:45:29

+1

如果有領帶,這不起作用。 – Thorsten 2009-11-07 23:56:22

0

我不確定我的回答顯然不是你問的,但是...我認爲,不要從tblBattleHistory獲得計數,你應該爲你添加2個文件用戶表(勝利,失敗)並更新它們(可能通過插入觸發器在tblBattleHistory上),所​​以你通過簡單的選擇就可以掌握所有數據。

+2

這將被認爲是多餘的和去標準化。除非你有性能問題,否則不要規格化! – 2009-11-07 23:46:18

+0

如果你想通過一個簡單的SELECT來簡化它,那麼建立一個視圖並做簡單的選擇......不需要爲了簡單的查詢而設計DB設計。你知道什麼是一個觀點,對嗎? – 2009-11-08 00:16:34

+0

實際上這既不是冗餘也不是反規範化。這只是直截了當的領域設計。 有一個用戶和用戶有勝利/寬鬆比例。這絕對不是關於性能。 --- 作爲視圖 - 你提出的觀點是愚蠢的域模型的設計(沒必要談這些模型映射到啞DB結構)的直接結果 海事組織,當然:) – COTOHA 2009-11-14 00:28:40

0
SELECT username, losses, wins 
FROM (
    SELECT username, COUNT(id) AS wins 
    FROM tblBattleHistory 
    WHERE battle_type = '0' && outcome = '1' 
    GROUP BY username 
) A 
LEFT JOIN (
    SELECT username, COUNT(id) as losses 
    FROM tblBattleHistory 
    WHERE battle_type = '0' && outcome = '0' 
) B ON A.username = B.username 
ORDER BY wins DESC, losses ASC 

這可能不是一個有效的查詢,但做這項工作。

4

這裏是我的想法:

SELECT username, SUM (CASE WHEN outcome = '1' Then 1 Else 0 End) As Wins, 
    SUM (CASE WHEN outcome = '0' Then 1 Else 0 End) As Losses 
FROM tblBattleHistory 
WHERE battle_type = '0' 
GROUP BY username 
ORDER BY wins DESC, Losses ASC 

(根據你的DBMS,您可能需要重複在Order By的總和,而不是使用別名)

這也允許拿出一些陌生人點方案,例如用於德國足球(WIN = 3,領帶= 1分)

SELECT username, SUM (CASE 
    WHEN outcome = '1' Then 3 
    WHEN outcome = '2' Then 1 /* 2 is a tie */ 
    ELSE 0 End) As Points 
etc. 
1

這也可能工作:

SELECT 
    username, 
    SUM(IF(outcome = 1, 1, 0)) AS 'wins', 
    SUM(IF(outcome = 0, 1, 0)) AS 'losses' 
FROM 
    tblBattleHistory; 

它基本上是計數outcome = 1outcome = 0的發生次數。