Mysql 跨多个表求和值

Mysql 跨多个表求和值,mysql,sum,Mysql,Sum,我在尝试对两个不同表中由公共用户ID分组的字段求和时遇到问题 给你更多的信息。。。我试图按日期追踪球员的表现(即:11月14日的得分最多)。数据库是分开的,一个表用于常规赛,一个表用于季后赛。例如,一名球员可能在2001年5月3日打了一场常规赛……但在2005年5月3日打了一场季后赛 所以,我试图用所有日期的每个玩家的总和建立一个视图 我为一张桌子准备了什么: SELECT PlayerId,sum(Points) as TOT_PTS FROM RS_games WHERE DAY(Dat

我在尝试对两个不同表中由公共用户ID分组的字段求和时遇到问题

给你更多的信息。。。我试图按日期追踪球员的表现(即:11月14日的得分最多)。数据库是分开的,一个表用于常规赛,一个表用于季后赛。例如,一名球员可能在2001年5月3日打了一场常规赛……但在2005年5月3日打了一场季后赛

所以,我试图用所有日期的每个玩家的总和建立一个视图

我为一张桌子准备了什么:

SELECT PlayerId,sum(Points) as TOT_PTS 
FROM RS_games 
WHERE DAY(Date)=$cur_day 
  AND MONTH(Date)=$cur_month 
GROUP BY PlayerId
…但我不知道如何在不创建第三个视图作为“垫脚石”的情况下,将两个表中每个玩家的值相加。
有什么想法吗?

如果您希望在(日-月)之前获得结果,您可以:

SELECT playerID, 
       CONCAT (DAY(DATE), '-', MONTH(DATE)) AS DAY_MONTH, 
       SUM(points) AS Total_Points
FROM (
  SELECT playerID, DATE, points
  FROM rs_games  
  UNION ALL  
  SELECT playerID, DATE, points
  FROM po_games
  ) a
GROUP BY 1, 2


这样,您将得到每个playerId、dd-mm的结果,以及历年中特定日期的得分总和。

如果您希望在(日-月)前获得结果,您可以执行以下操作:

SELECT playerID, 
       CONCAT (DAY(DATE), '-', MONTH(DATE)) AS DAY_MONTH, 
       SUM(points) AS Total_Points
FROM (
  SELECT playerID, DATE, points
  FROM rs_games  
  UNION ALL  
  SELECT playerID, DATE, points
  FROM po_games
  ) a
GROUP BY 1, 2


这样,你将得到一个结果,每个玩家ID,dd mm,以及这些年中特定日期的得分总和。

我想说的是:

select
  ALL_players.PlayerID as PlayerID
  COALESCE(reg.Points, 0) + COALESCE(po.Points, 0) as Points
from
ALL_players
left join
(select PlayerID, DATE(Date) as Date, sum(Points) as Points 
 from RS_games
 WHERE DAY(Date)=$cur_day AND MONTH(Date)=$cur_month
 group by PlayerID) as reg
on reg.PlayerID = ALL_players.PlayerID
left join
(select PlayerID, DATE(Date) as Date, sum(Points) as Points 
 from PO_games group by DATE(Date), PlayerID
 WHERE DAY(Date)=$cur_day AND MONTH(Date)=$cur_month
 group by PlayerID) as po
on po.PlayerID = ALL_players.PlayerID

编辑:再次查看需求这将需要一个完整的外部连接或一些调整。。。调整(现在应该可以工作了)

只是为了展示我所说的:

select
  ALL_players.PlayerID as PlayerID
  COALESCE(reg.Points, 0) + COALESCE(po.Points, 0) as Points
from
ALL_players
left join
(select PlayerID, DATE(Date) as Date, sum(Points) as Points 
 from RS_games
 WHERE DAY(Date)=$cur_day AND MONTH(Date)=$cur_month
 group by PlayerID) as reg
on reg.PlayerID = ALL_players.PlayerID
left join
(select PlayerID, DATE(Date) as Date, sum(Points) as Points 
 from PO_games group by DATE(Date), PlayerID
 WHERE DAY(Date)=$cur_day AND MONTH(Date)=$cur_month
 group by PlayerID) as po
on po.PlayerID = ALL_players.PlayerID


编辑:再次查看需求这将需要一个完整的外部连接或一些调整。。。调整(现在应该可以工作了)

您想按天和月分组吗?正确-最终表格应该在5月3日有每个玩家的总积分,例如,通过子查询,您可以对每个表格逐个进行分组和求和(),然后将结果加入主表格(如果你不需要主表数据,也可以将两个表相互合并)。@dsol828.我用一种我认为适合你的方法取消了我的答案。看看这是否是你想要的。你想按天和月分组吗?正确-最终表应该在5月3日有每个玩家的总积分,例如,通过子查询,你可以进行分组和求和()在每个表上一次一个,然后将结果连接到主表中(如果不需要主表数据,则只将两个表连接到彼此中)@dsol828.我用一种我认为对你有效的方法取消了我的答案。看看这是否是你想要的。如果同一名玩家在两张桌子上一天玩了多场游戏,这难道不会导致重复计算吗?(我猜那将是4场游戏,所以我们可能是安全的,但在一般解决方案中,这将是一个问题)再次查看该查询,它可能有多个漏洞,是的。我现在要删除它。这到底会产生什么错误?只是想确定一下。@dsol828。它不是这个版本。这是我第一次发布。然后我编辑并编写了这个。:@FilipeSilva Ya,使用UNION的子查询要干净得多。如果两个表中的同一玩家在同一天玩了多个游戏,这难道不会导致重复计算吗?(我猜那将是4场比赛,所以也许我们是安全的,但在一般的解决方案中,这将是一个问题)再次查看查询,这可能有多个洞,是的。我现在要删除它。这到底会产生什么错误?只是想确定一下。@dsol828。它不是这个版本。这是我第一次发布。然后我编辑了它并写下了这一条@FilipeSilva Ya,使用UNION的子查询更干净。我很想尝试您的解决方案,但不断出现以下错误。我找不到语法错误。您的SQL语法有错误;查看与您的MySQL服务器版本对应的手册,了解在第3行中使用“COALESCE(reg.Points,0)+COALESCE(po.Points,0)作为所有玩家左侧的点”的正确语法,在PlayerID后缺少逗号。但是,我的mysql客户端不允许子查询……hmmmI很想尝试一下您的解决方案,但不断出现以下错误。我找不到语法错误。您的SQL语法有错误;查看与您的MySQL服务器版本对应的手册,了解在第3行中使用“COALESCE(reg.Points,0)+COALESCE(po.Points,0)作为所有玩家左侧的点”的正确语法,在PlayerID后缺少逗号。但是,我的mysql客户端不允许子查询……嗯