【问题标题】:Select count of two columns while grouped by分组时选择两列的计数
【发布时间】:2015-04-07 13:42:28
【问题描述】:

我正在尝试为下表中存在的每个玩家名称选择玩家在下表中的赢和输次数。

这张桌子存放着玩过的游戏。

┌──┬────────┬────────┐
│id│winner  │loser   │
├──┼────────┼────────┤
│1 │player1 │ player2│
├──┼────────┼────────┤
│2 │player1 │ player2│
├──┼────────┼────────┤
│3 │player2 │ player1│
├──┼────────┼────────┤
│4 │player3 │ player2│
└──┴────────┴────────┘

示例:在上表中,player1 将获得两胜一负。我正在尝试选择每个玩家的胜负数。

我目前有以下 SQL

SELECT winner, count(winner) FROM multiplayergamestbl GROUP BY winner

这将返回每个玩家以及他们的胜利,但失败的计数不是我所期望的,失败的计数将返回与胜利计数相同的值。我显然对 SQL 有点陌生,有人可以帮助我吗?

【问题讨论】:

    标签: mysql sql


    【解决方案1】:

    执行此操作的一种方法是执行两个单独的查询(一个用于获胜者计数,一个用于失败者计数)并将它们合并在一起并将结果用作派生表,如下所示:

    select player, max(count_winner), max(count_loser) 
    from (
    
      SELECT winner as player, count(winner) as count_winner, null as count_loser 
      FROM multiplayergamestbl 
      GROUP BY winner
    
      union all
    
      SELECT loser as player, null as count_winner, count(loser) as count_loser
      FROM multiplayergamestbl 
      GROUP BY loser
    
      ) t
    group by player;
    

    外部查询使用 max 聚合函数来展平行,如果没有它,您将得到五行而不是三行(请参阅this example)。

    Sample SQL Fiddle

    【讨论】:

    • 绝对完美,感谢您的额外说明和 SQL fiddle。
    【解决方案2】:

    首先使用子查询将您的表格转换为更接近应有的格式,然后对其进行简单的求和:

    select player, sum(won) won, sum(lost) lost from (
      select winner player, 1 won, 0 lost from multiplayergamestbl
      union select loser, 0, 1 from multiplayergamestbl) x
    group by player
    

    【讨论】:

      【解决方案3】:

      这可能与您想要的相似。

      select 'winner' category
      , winner
      , count(*) records
      from multiplayergamestbl 
      group by 'winner', winner
      
      union
      
      select 'loser' category
      , loser
      , count(*) records
      from multiplayergamestbl 
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多