在 MySQL 中插入后两行中值的条件增量

Conditional increment of values in two rows after insert in MySQL

我目前在足球数据库中有以下三个 table:

teams(name) 
season(name, beginning, end)
game(id, Date, season, hometeam, awayteam, HomeTeamScore, AwayTeamScore)
      (hometeam, awayteam and season are foreign keys)

现在我想要一个新的 table,我可以在其中跟踪每支球队的进球数和失球数,以及他们的积分(每平局一分,每胜三分)每个季节。这样可以轻松获得排名。

我想过做一个这样的table:

stats(season, team, goalsscored, goalsconcedded, points) 

然后每次插入新游戏我也会更新它。此 table 将为每个团队+赛季组合包含一行。我不确定这是最好的解决方案,因为我知道我正在引入冗余,但由于需要经常计算此信息,我认为它可能有用。我想创建一个更新此信息的触发器,但我真的不知道该怎么做:我必须更新统计数据 table 中的两行,具体取决于哪些球队正在玩该游戏,并取决于事实上,他们是在主场还是客场比赛,我需要用不同的值更新它们。

理想情况下,这个触发器应该在这个新的 table 中创建一个条目,如果球队还没有被插入到游戏所指的赛季,但我什至不确定这种情况是否可能在 MySQL。 我知道我没有提供我做过的任何测试,但这是因为我真的无法在网上找到类似的请求(或者更笼统地说能够轻松查询请求的信息)。

此外,我愿意接受更好的想法来处理这种情况。

我认为你应该考虑这样的事情:

Teams(id,name)
Seasons(id, year,begin_date,end_date)
Games(id, date, season (foreign key), hometeam (foreign key), awayteam (foreign key), HomeTeamScore, AwayTeamScore)

这也是次优的。 以我的拙见,你可以像这样做得更好

Teams(id,name)
Seasons(id, year,begin_date,end_date)
Matches(id, date, season (foreign key), home_team (foreign key), away_team (foreign key))
Goals(id,team,game,player?) 

目标 table 将用于记录每个目标,然后您可以从那里构建比赛结果,避免使用“HomeTeamScore”和“AwayTeamScore”字段。

至于统计数据 table 你需要知道谁赢得了积分所以让我们坚持我们最后的 table 集:

Teams(id,name)
Seasons(id, year,begin_date,end_date)
Matches(id, date, season (foreign key), home_team (foreign key), away_team (foreign key), status)
Goals(id,team,game,player?) 

Matches 中的 Status 字段值可以是:['1','X','2']

  • 1 - 主队获胜
  • X - 平局
  • 2 - 客队获胜

通过这种方式,您可以轻松获得用于计算统计数据的所有内容,例如对于 ID 为 12 的团队:

Select * from Matches where home_team = 12 and result = '1';
Select * from Matches where away_team = 12 and result = '2';
Select * from Matches where home_team = 12 or away_team=12 and result='X';

您可以以此为起点,使用 group by 和 group 函数构建稍微复杂的查询来计算团队统计数据。 一旦你设法创建了这样的查询,我建议使用 view

顺便说一下,您要执行的这些不是繁重的查询,您不一定需要触发器,只要先考虑良好的数据库设计即可!

比使用触发器维护冗余数据更容易的是拥有一个视图;这只是联合的基本总和:

create view stats as (
    select season, team, sum(goalsscored) goalsscored, sum(goalsconcedded) goalsconcedded, sum(points) points
    from (
        select season, hometeam team, HomeTeamScore goalsscored, AwayTeamScore goalsconcedded,
            case when HomeTeamScore > AwayTeamScore then 3 when HomeTeamScore=AwayTeamScore then 1 else 0 end points
        from game
        union all
        select season, awayteam team, AwayTeamScore goalsscored, HomeTeamScore goalsconcedded,
            case when AwayTeamScore > HomeTeamScore then 3 when AwayTeamScore=HomeTeamScore then 1 else 0 end points
        from game
    ) games
    group by season, team
);