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

时间:2020-03-11 09:53:53

标签: mysql join count

我有一个表,该表存储在线游戏的排名。该表(玩家)有4列(玩家ID,玩家名称,当前ELO和玩家状态)。我也想显示游戏的获胜/失败,但是该信息在“重播”表中,该表每个单独的游戏都有一行。 我可以使用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。谢谢!

1 个答案:

答案 0 :(得分:3)

您可以在播放器列表中使用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

相关问题