MySQL中INSERT后两行值的条件增量

2022-07-11 00:00:00 sql-update sql mysql sql-insert triggers

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

teams(name) 
season(name, beginning, end)
game(id, Date, season, hometeam, awayteam, HomeTeamScore, AwayTeamScore)
      (hometeam, awayteam and season are foreign keys)
现在我想要一个新的表,用来记录每支球队的得分和丢球情况,以及他们在每个赛季的得分(每次平局一分,每次胜利三分)。这将使其能够轻松获得排名。

我想过做这样一张表:

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

然后我还会在每次插入新游戏时更新它。该表将为每个球队+赛季组合包含一行。我不确定这是不是最好的解决方案,因为我知道我引入了冗余,但由于此信息需要经常计算,我认为它可能有用。我想创建一个触发器来更新此信息,但我不知道如何做到这一点:我必须更新统计表中的两行,这取决于哪支球队正在打这场比赛,并且根据他们是在主场还是客场比赛,我需要用不同的值来更新这些行。

理想情况下,如果还没有为比赛所指的赛季插入球队,则此触发器应该会在这个新表中创建一个条目,但我甚至不确定MySQL中是否可能出现这种情况。 我知道我没有提供我所做的任何测试,但这是因为我确实在网上找不到类似的请求(或者更广泛地说,为了能够轻松地查询所请求的信息)。

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


解决方案

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

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
);

相关文章