MYSQL 将一个表中的一列连接到另一个表中的两个 count()

标签 mysql join count

我有一个表,用于存储在线游戏的排名。该表(玩家)有 4 列(Player_ID、Player_Name、Current_ELO 和 Player_Status)。我还想显示赢/输的比赛,但该信息位于重播表中,每场比赛都有一行。 我可以使用 count(*) 函数轻松计算赢局或输局的数量:

select Winner, count(*) from Replays group by Winner;
select Loser, count(*) from Replays group by Loser;

但是,我找不到连接两个表的方法,所以我的最终结果如下:

+-------------+-------------+-----------+------------+
| Player_Name | Current_ELO | Won games | Lost games |
+-------------+-------------+-----------+------------+
| John        | 1035        | 5         | 3          |
+-------------+-------------+-----------+------------+

我最好的猜测是这样,但是返回了太多结果,因为我无法针对每个计数将“count()”按获胜者/失败者单独分组:

select Player_Name,  Current_ELO, Player_Status, count(Winner_Replays.Winner), count(Loser_Replays.Loser) from Players
inner join Replays as Winner_Replays on Winner_Replays.Winner = Players.Player_Name
inner join Replays as Loser_Replays on Loser_Replays.Loser = Players.Player_Name
group by Winner_Replays.Winner order by Current_ELO desc;

理想情况下,由于某些玩家可能取得 0 胜或 0 负,我希望它为这些用户返回 0(如果可能的话)。谢谢!

最佳答案

您可以使用以下内容,在玩家列表上使用 INNER JOIN 及其重播结果。您可以将 SUMCASE 结合使用来获取每个玩家的胜利/失败次数。

SELECT Players.Player_Name, ANY_VALUE(Current_ELO), ANY_VALUE(Player_Status),
  SUM(CASE WHEN result = 'L' THEN 1 ELSE 0 END) AS Lost_Games, 
  SUM(CASE WHEN result = 'W' THEN 1 ELSE 0 END) AS Won_Games
FROM Players INNER JOIN (
  SELECT 'W' AS result, Winner AS Player_Name FROM Replays
  UNION ALL
  SELECT 'L', Loser FROM Replays
) win_lose ON Players.Player_Name = win_lose.Player_Name
GROUP BY Players.Player_Name
ORDER BY ANY_VALUE(Current_ELO) DESC;

您还可以使用 LEFT JOIN 解决方案,如下所示:

SELECT Players.Player_Name, ANY_VALUE(Current_ELO) AS Current_ELO, ANY_VALUE(Player_Status) AS Player_Status,
  COUNT(DISTINCT rLoser.ReplayID) AS Lost_Games, 
  COUNT(DISTINCT rWinner.ReplayID) AS Won_Games
FROM Players
  LEFT JOIN Replays AS rWinner ON rWinner.Winner = Players.Player_Name
  LEFT JOIN Replays AS rLoser ON rLoser.Loser = Players.Player_Name
GROUP BY Players.Player_Name
ORDER BY ANY_VALUE(Current_ELO) DESC;

demo on dbfiddle.uk

关于MYSQL 将一个表中的一列连接到另一个表中的两个 count(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60633262/

相关文章:

mysql - MySQL JOIN 的评估顺序是什么?

sql - SQL 查询中的计数?

mysql - 将 nHibernate 与 MySql 结合使用时出现身份生成问题

mysql - 需要 MYSQL 查询仅选择特定子行

JavaScript 链式连接函数?

php - Mysql获取两个表的所有连接记录

matlab - 计算前 36 行中某项出现的次数

haskell - 计算列表中每个元素的所有出现次数

mysql 工作台将 nvarchar 列转换为 varchar?

MySQL:获取上一个行分组