【问题标题】:how to combine results to get number of teams against whom Arsenal won all the available six points如何结合结果来获得阿森纳赢得所有可用六分的球队数量
【发布时间】:2021-04-06 15:04:44
【问题描述】:

我有一个名为“home”的表,用于存储阿森纳足球俱乐部在 2003-04 赛季主场联赛中的表现,而“away”表则存储阿森纳在同一赛季客场的表现。

Table `home`:

Opponent           Goal_Scored      Goal_Conceded
Everton                2                 1
Aston Villa            2                 0
Portsmouth             1                 1
Newcastle United       3                 2
Chelsea                2                 1
Tottenham Hotspur      2                 1
Fulham                 0                 0
Blackburn Rovers       1                 0
Wolverhampton Wonderers 3                0
Middlesbrough          4                 1


Table `away`:

Opponent           Goal_Scored      Goal_Conceded
Everton                1                 2
Aston Villa            2                 2
Portsmouth             1                 2
Newcastle United       2                 3
Chelsea                2                 2
Tottenham Hotspur      2                 3
Fulham                 2                 0
Blackburn Rovers       1                 2
Wolverhampton Wonderers 3                2
Middlesbrough          1                 4

请注意,一支球队获胜获得 3 分,平局获得 1 分,失败获得 0 分

我想确定阿森纳赢得所有可用六分的球队数量。

为此,我编写了部分代码:

CREATE TABLE home (
    Opponent varchar(60),
    Goal_Scored int(8),
    Goal_Conceded int(8)
);

CREATE TABLE away (
    Opponent varchar(60),
    Goal_Scored int(8),
    Goal_Conceded int(8)
);

INSERT INTO home (Opponent, Goal_Scored, Goal_Conceded)
VALUES 
("Everton",2,1),
("Aston Villa",2,0),
("Portsmouth",1,1),
("Newcastle United",3,2),
("Chelsea",2,1),
("Tottenham Hotspur",2,1),
("Fulham",0,0),
("Blackburn Rovers",1,0),
("Wolverhampton Wonderers",3,0),
("Middlesbrough",4,1);


INSERT INTO away (Opponent, Goal_Scored, Goal_Conceded)
VALUES
("Everton",1,2),
("Aston Villa",2,2),
("Portsmouth",1,2),
("Newcastle United",2,3),
("Chelsea",2,2),
("Tottenham Hotspur",2,3),
("Fulham",2,0),
("Blackburn Rovers",1,2),
("Wolverhampton Wonderers",3,2),
("Middlesbrough",1,4);

为了得到综合结果,我尝试了下面的代码,但没有产生预期的结果:

select a.opponent
from home a 
where a.goals_scored > a.goals_conceded
union all
select b.opponent
from away b 
where b.goals_scored > b.goals_conceded

然后我应该如何结合结果来获得阿森纳赢得所有可用六分的球队数量

【问题讨论】:

  • 简单来说,您需要寻找目标得分 > 目标得分的球队,而不是实际计算和求和积分,您需要join the two tables。你知道如何加入吗?
  • (也就是说,您可以将两个表的点计算为子查询 - 或 MySQL 8+ 中的 CTE - 然后如果您愿意,可以加入它们。但您不需要,您只需要从每张桌子中找出获胜者。)
  • 实际上,我需要加入,因为最终我必须找到所有那些阿森纳获得全部 6 分(主场赢 3 分,主场赢 3 分)的球队。客场获胜)...实际上,您是对的,goals_scored >goals_conceded 应该足够好,可以加入事情...

标签: mysql sql


【解决方案1】:

没有必要根据您的要求检查积分。
条件应该是同一个对手Goal_Scored > Goal_Conceded为真:

SELECT Opponent
FROM (
  SELECT * FROM home WHERE Goal_Scored > Goal_Conceded
  UNION ALL
  SELECT * FROM away WHERE Goal_Scored > Goal_Conceded
) t
GROUP BY Opponent
HAVING COUNT(*) = 2 -- for 2 matches against the same opponent

如果您只想要团队的数量,那么使用EXISTS 聚合会更好:

SELECT COUNT(*) number_of_teams 
FROM home h
WHERE h.Goal_Scored > h.Goal_Conceded
  AND EXISTS (SELECT 1 FROM away a WHERE a.Opponent = h.Opponent AND a.Goal_Scored > a.Goal_Conceded) 

请参阅demo

【讨论】:

    【解决方案2】:

    既然您已经有了解决方案,这里是加入解决方案:

    select opponent
    from home
    join away using (opponent)
    where home.goal_scored > home.goal_conceded
      and away.goal_scored > away.goal_conceded;
    

    我们将每支球队的主客场记录加入其中,然后过滤掉阿森纳没有赢得两回合的所有记录。

    【讨论】:

      【解决方案3】:

      如果我理解正确,你可以这样做:

      select t.Opponent, sum(CASE WHEN goal_scored - goal_conceded > 0 THEN 3
      WHEN goal_scored - goal_conceded = 0 THEN 1 ELSE 0 end ) points 
      from 
      ( SELECT * FROM home a
        union all
        SELECT * FROM away a
      ) t
      group by Opponent
      having points = 6;
      

      db小提琴here

      【讨论】:

      • 感谢分享...只是想知道是否也可以使用where a.goal_scored > a.goal_conceded,因为从数学上讲,这个条件也给出了主场赢 3 分和客场赢 3 分。并因此计算他们在主场和客场获胜的球队数量???
      • 是的,这也是可能的,请参阅 Rup 的回答
      猜你喜欢
      • 1970-01-01
      • 2021-12-28
      • 2017-07-11
      • 1970-01-01
      • 2018-10-09
      • 1970-01-01
      • 2021-07-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多