【问题标题】:Sum values across multiple tables跨多个表求和值
【发布时间】:2013-11-14 16:54:08
【问题描述】:

我在尝试对两个不同表中的一个公共用户 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

...但我不知道如何在不创建第三个视图作为“垫脚石”的情况下将两个表中每个玩家的值相加。 有什么想法吗?

【问题讨论】:

  • 你想按天和月分组吗?
  • 正确 - 例如,决赛桌应该有每个玩家在 5 月 3 日的总点数
  • 通过子查询,您可以一次对每个表执行 GROUP BY 和 SUM(),然后将结果加入主表(或者如果您不这样做,则将两个表相互连接'不需要主表数据)。
  • @dsol828。我用我认为适合你的方法取消了我的答案。看看是不是你想要的。

标签: mysql sum


【解决方案1】:

如果你想在(DAY-MONTH)之前得到结果,你可以这样做:

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

sqlfiddle demo

这样,您最终会得到一个包含每个 playerId、dd-mm 的结果,以及这些年来特定日期得分的总和。

【讨论】:

  • 如果同一玩家在同一天在两张牌桌上玩了不止一场比赛,这会不会导致重复计算? (我猜这将是 4 场比赛,所以也许我们是安全的,但在一般解决方案中这将是一个问题)
  • 再看查询,这个可以有多个漏洞,是的。我现在要删除它。
  • 这究竟会如何产生错误?只是想确定一下。
  • @dsol828。不是这个版本。这是我发布的第一个。然后我编辑它并写了这个。 :)
  • @FilipeSilva 是的,UNION 的子查询更简洁。
【解决方案2】:

只是为了说明我在说什么:

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

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

【讨论】:

  • 我很想尝试您的解决方案,但不断收到以下错误。我找不到语法错误。您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,以在第 3 行的“COALESCE(reg.Points, 0) + COALESCE(po.Points, 0) as Points from ALL_players left”附近使用正确的语法
  • 在 PlayerID 后面刮掉缺少的逗号。我的 mysql 客户端不允许子查询,但是....hmmm
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-07-09
  • 1970-01-01
相关资源
最近更新 更多