【问题标题】:php/mysql - Calculations from match results (goals)php/mysql - 根据比赛结果计算(目标)
【发布时间】:2018-09-25 12:17:02
【问题描述】:

我有一个包含一个赛季所有足球比赛的数据库,我想对结果进行一些简单的计算。这是桌子的样子:

+----------+----------+---------------+---------------+--+
| HomeTeam | AwayTeam | HomeTeamGoals | AwayTeamGoals |  |
+----------+----------+---------------+---------------+--+
| team1    | team2    |             3 |             1 |  |
| team3    | team4    |             1 |             2 |  |
| team1    | team3    |             4 |             4 |  |
| team4    | team2    |             0 |             1 |  |
+----------+----------+---------------+---------------+--+

现在我想为每个团队计算 4 件事:
- 主场比赛总进球数
- 客场比赛总进球数
- 主场比赛的总进球数
- 客场比赛总进球数

通过这个查询,我可以正确地返回主场比赛的所有信息:

SELECT HomeTeam, SUM(HomeTeamGoals) as HomeTeamGoals, SUM(AwayTeamGoals) as AwayTeamGoals
FROM games
GROUP BY HomeTeam

但是我现在如何获取客场比赛的信息(来自同一个查询)?

根据上表中的数据,结果应该如下:

+-------+----------+--------------+----------+--------------+
| team  | home for | home against | away for | away against |
+-------+----------+--------------+----------+--------------+
| team1 |        7 |            5 |        0 |            0 |
| team2 |        0 |            0 |        2 |            3 |
| team3 |        1 |            2 |        4 |            4 |
| team4 |        0 |            1 |        2 |            1 |
+-------+----------+--------------+----------+--------------+

【问题讨论】:

  • 您共享的表中没有 FTHG 或 FTAH 字段。查询与表不匹配
  • @LelioFaieta 我的错,现在已在查询中修复。
  • 在表格结构中显示您的预期结果
  • @fa06 添加到原件。
  • @Awesom-o,你可以查看答案

标签: mysql sql group-by sum


【解决方案1】:

用 union all 试试这个:

https://dbfiddle.uk/?rdbms=mysql_8.0&fiddle=1a1bbfadd62ed68808605a9e7767870d

select hometeam, sum(HomeTeamGoals) as homefor,sum(AwayTeamGoals) as homeagainst, 0 as awayfor, 0 as awayagainst from tablename
group by hometeam

union all

select AwayTeam, 0,0, sum(HomeTeamGoals) as awayfor, sum(AwayTeamGoals) as awayagainst from tablename
group by AwayTeam

输出:

hometeam    homefor homeagainst awayfor awayagainst
team1       7       5            0      0
team4       0       1            0      0
team2       0       0            3      2
team3       0       0            4      4

【讨论】:

  • 嗨 Fa06!我得到了所有正确的数据,所以这很完美!感谢那。打印数据时遇到了一个问题,它现在显示所有球队的列表两次,一个包含所有主场数据的列表,一个包含所有客场数据的列表。我们现在的做法正常吗?
  • 这是我用来打印数据的代码:phpfiddle.org/main/code/qg3k-5u8t
【解决方案2】:

你可以试试这个

输入:

create table goals(
homeTeam varchar(10),
awayTeam varchar(10),
homeTeamGoals tinyint,
awayTeamGoals tinyint
);
insert into goals values('team1','team2',3,1),('team3','team4',1,2),('team1','team3',4,4),('team4','team2',0,1);

输出:

select totalTeams.team as hometeam,
  case when a.totalHomeGoals IS NULL THEN 0 ELSE a.totalHomeGoals END as totalHomeGoals,
  case when a.totalHomeAgainstGoals IS NULL THEN 0 ELSE a.totalHomeAgainstGoals END as totalHomeAgainstGoals,
  case when b.totalAwayGoals IS NULL THEN 0 ELSE b.totalAwayGoals END as totalAwayGoals,
  case when b.totalAwayAgainstGoals IS NULL THEN 0 ELSE b.totalAwayAgainstGoals END as totalAwayAgainstGoals
      from (select homeTeam as team from goals union select awayTeam from goals) as totalTeams 
      left join (select homeTeam as team, sum(homeTeamGoals) as totalHomeGoals,sum(awayTeamGoals) as totalHomeAgainstGoals from goals group by hometeam) as a on totalTeams.team=a.team
      left join (select awayTeam as team,sum(awayTeamGoals) as totalAwayGoals,sum(homeTeamGoals) as totalAwayAgainstGoals from goals group by awayTeam) as b on totalTeams.team=b.team 
      order by hometeam ;

【讨论】:

    猜你喜欢
    • 2013-11-18
    • 1970-01-01
    • 2017-11-23
    • 2022-10-03
    • 2017-05-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多