【问题标题】:How do I sum the result of 2 group by queries如何通过查询对 2 组的结果求和
【发布时间】:2013-12-13 22:34:39
【问题描述】:

我有一个基本表 RESULTS(id,winner_id,loser_id)。获胜者 ID 和失败者 ID 都引用“玩家”表中的同一列。我可以执行 1 GROUP BY 查询来检索获胜总数,并且可以执行非常相似的查询来检索失败总数。

select winner_id, count(*) as total_wins
from results group by winner_id order by total_wins desc

select loser_id, count(*) as total_losses
from results group by loser_id order by total_losses desc

现在我正在尝试执行一个查询,该查询实质上将结合这两个查询并返回按 ID 分组的 total_results。谁能指出我正确的方向?

【问题讨论】:

  • total_results 应该是total_wins 减去total_losses?你的表定义看起来像......?

标签: mysql sql join count aggregate-functions


【解决方案1】:

如果您实际上返回了玩家的 id,那么查询似乎会更有意义。否则,您将只有一个有序数量的数字,但没有它们对应的参考:

select player_id, sum(total) total from (
  select winner_id player_id, count(*) total from results group by winner_id
  union all
  select loser_id, count(*) from results group by loser_id
) s
group by player_id
order by total desc

【讨论】:

  • 谢谢,是的,我最初确实在查询中包含了 ID,只是当我将它们复制到这个问题中时忘记了它们。我更新了我的起源问题。此外,这正是我想要的。谢谢!
【解决方案2】:

您可以在每个子查询的结果中包含 id 并将它们连接在一起。然后你可以减去两个计数:

SELECT id, total_wins - total_losses AS total_results
FROM  (
    SELECT winner_id AS id, count(*) AS total_wins
    FROM   results
    GROUP  BY winner_id
    ) AS w
JOIN (
    SELECT loser_id AS id, count(*) AS total_losses
    FROM   results
    GROUP  BY loser_id
    ) AS l USING (id)
ORDER  BY total_results DESC;

请注意,[INNER] JOIN 会从结果中删除任何在两个子查询中都没有出现的id

您可以使用OUTER JOIN 来保留这些行,并且必须添加COALESCE 来处理NULL 值:

SELECT id, COALESCE(total_wins, 0) - COALESCE(total_losses, 0) AS total_results
FROM  (
    SELECT winner_id AS id, count(*) AS total_wins
    FROM   results
    GROUP  BY winner_id
    ) AS w
FULL OUTER JOIN (
    SELECT loser_id AS id, count(*) AS total_losses
    FROM   results
    GROUP  BY loser_id
    ) AS l USING (id)
ORDER  BY total_results DESC;

我刚刚意识到MySQL doesn't support FULL OUTER JOIN
使用UNION ALL 方法,即@Mosty supplied
或者对两个子查询使用LEFT JOIN 以加入具有所有 ID 的表。

【讨论】:

    猜你喜欢
    • 2016-01-04
    • 1970-01-01
    • 2022-01-11
    • 2020-04-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-21
    • 2021-05-03
    相关资源
    最近更新 更多