【问题标题】:Multiple COUNT on same table同一张表上有多个 COUNT
【发布时间】:2020-03-29 20:01:55
【问题描述】:

我有一张桌子:

   +----------+-----------+----------+--------+
    | id       |  winnerId | loserId  | gameId |
    +----------+-----------+----------+--------+
    | 1        | user1     | user2    |      1 |
    | 2        | user2     | user1    |      1 |
    | 3        | user1     | user2    |      1 |
    | 4        | user1     | user2    |      2 |
      5          user1       user3           1
    +----------+-----------+----------+--------+

实际上我在表中有更多列,但它们无关,但请考虑

给定winnerId、loserId 和gameId,我想获得获胜者和失败者玩家相互对抗

的总得分(获胜次数)

查询输入示例:

winnerId:user1
loserId:user2
gameId:1

结果:

   --userId--totalScore--
       user1      2           
       user2      1

【问题讨论】:

  • 做一个 GROUP BY。使用 COUNT()。
  • 赢家/输家ID有什么相关性?看起来您刚刚给出了 gameId 1 的每个用户的获胜次数,即 SELECT winnerId, count(*) FROM t WHERE gameid = 1 GROUP BY winnerId - 它会产生您的输出并且根本不使用用户 ID
  • 我想获取 2 名玩家之间的获胜次数。我在示例数据中添加了一行以更好地解释

标签: mysql sql


【解决方案1】:

选择两个玩家互相对战的行。然后计算游戏中每个获胜者的行数:

select winnerid, count(*) 
from mytable
where gameid = 1
and (winnerid, loserid) in ((1,2), (2,1))
group by winnerid;

演示:https://dbfiddle.uk/?rdbms=mysql_5.7&fiddle=976df92c9706c08d34a1c372735efa4c

编辑:如果其中一名球员从未赢过另一名球员,则将没有行数。如果您想在这种情况下查看计数为零的结果行,则必须首先创建一行。一种方法是:

select playerid, sum(won) 
from 
(
  select winnerid as playerid, 1 as won
  from mytable
  where gameid = 1
  and (winnerid, loserid) in ((1,2), (2,1))
  union all 
  select loserid as playerid, 0 as won
  from mytable
  where gameid = 1
  and (winnerid, loserid) in ((1,2), (2,1))
)
group by playerid
order by playerid;

【讨论】:

  • 抱歉解释不好我编辑了我的问题。我正在尝试获取赢家和输家玩家的获胜次数。
  • 这就是and (winnerid, loserid) in ((1,2), (2,1)) 完成的工作。
  • 什么是 (1,2),(2,1) ?我的结果是空的。也许是因为我有一些不相关的其他专栏?
  • 那你搞错了。看这个演示:dbfiddle.uk/…
  • 是的,这是可能的。我已经用一种可能的解决方案更新了我的答案。
【解决方案2】:

这听起来像是聚合和过滤:

select winnerId as userId, count(*) as num_wins
from t
where ? in (winnerId, loserId) and
      ? in (winnerId, loserId) and
      gameId = ?
group by winnerId

【讨论】:

  • 我想获取 2 名玩家之间的获胜次数。我在示例数据中添加了一行以更好地解释
猜你喜欢
  • 2016-10-14
  • 1970-01-01
  • 2013-02-28
  • 1970-01-01
  • 1970-01-01
  • 2023-03-30
  • 2015-05-18
  • 2014-07-11
  • 2015-07-24
相关资源
最近更新 更多