【问题标题】:Summing column after multiple Union and Join operations多个 Union 和 Join 操作后的求和列
【发布时间】:2019-05-05 08:12:21
【问题描述】:

我希望根据属于某个球队的球员对列的总数求和。我有一张球员桌和一张球队桌。目前,我没有问题,只是由于某种原因它不会总结我查询的最后一部分。这是我的代码示例:

Select SUM(points)
from (select points
from player
Join team on player.full_name=team.player1
Where team.team_id = 8
and week =9
UNION
Select points
FROM player 
JOIN team on player.full_name=team.player2 
Where team.team_id = 8
and week =9
UNION
Select points
FROM player 
JOIN team on player.full_name=team.player3
Where team.team_id = 8
and week =9
UNION
Select points
FROM player 
JOIN team on player.full_name=team.player4
Where team.team_id = 8
and week =9

任何关于为什么会发生这种情况的想法或完成它的更好的潜在方法将不胜感激!

【问题讨论】:

  • 列points是属于表player还是team?
  • 在玩家表中

标签: mysql database join union


【解决方案1】:

您的查询似乎不完整,您必须使用 UNION ALL 来获得全部总数(如果 2 位或更多玩家拥有相同的点数,UNION DISTINCT 将消除这些行):

SELECT
    SUM( points )
FROM (
    SELECT
        points
    FROM player
    JOIN team ON player.full_name = team.player1
    WHERE team.team_id = 8
    AND week = 9
    UNION ALL
    SELECT
        points
    FROM player
    JOIN team ON player.full_name = team.player2
    WHERE team.team_id = 8
    AND week = 9
    UNION ALL
    SELECT
        points
    FROM player
    JOIN team ON player.full_name = team.player3
    WHERE team.team_id = 8
    AND week = 9
    UNION ALL
    SELECT
        points
    FROM player
    JOIN team ON player.full_name = team.player4
    WHERE team.team_id = 8
) d

但我认为您的团队表需要更改以提高效率

请注意,使用 UNION = UNION DISTINCT 即如果省略,则假定为“不同”。

这可能更有效:

SELECT
    SUM( player.points )
FROM player
WHERE player.full_name IN (
    SELECT distinct
        case when cj.n = 1 then team.player1
             when cj.n = 2 then team.player2
             when cj.n = 3 then team.player3
             when cj.n = 4 then team.player4
        end
    FROM team
    cross join (
       select 1 as n union all
       select 2 as n union all
       select 3 as n union all
       select 4 as n
       ) cj
    WHERE team.team_id = 8
    )
AND player.week = 9    ;

【讨论】:

  • 太棒了。谢谢你。我同意团队表的构造不是很好。我将对其进行修改,但这至少会同时提供一些功能
  • 抱歉,还在考虑这个问题。
  • Week 目前不在团队中,但我现在可以很容易地添加它,而且可能看起来应该如此
  • 好的,我尝试了第二个查询,从团队中“取消透视”球员姓名,以便您可以简单地过滤姓名。它可能更有效。将来,您应该在所有列引用前加上表名(或别名,如果使用)。
  • 如果您的问题得到解决,请接受答案以获取更多信息,请参阅help/accepting 否则为“Click the Tick”
猜你喜欢
  • 2018-11-09
  • 1970-01-01
  • 1970-01-01
  • 2016-03-18
  • 2019-07-19
  • 2013-01-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多