2009-11-07 96 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的发生次数。