Maison > Questions et réponses > le corps du texte
P粉0186537512023-09-03 09:55:42
Je pense que vous devriez envisager une structure comme celle-ci :
Teams(id,name) Seasons(id, year,begin_date,end_date) Games(id, date, season (外键), hometeam (外键), awayteam (外键), HomeTeamScore, AwayTeamScore)
Cette structure n’est pas non plus optimale. À mon avis, vous pourriez opter pour une meilleure structure :
Teams(id,name) Seasons(id, year,begin_date,end_date) Matches(id, date, season (外键), home_team (外键), away_team (外键)) Goals(id,team,game,player?)
Le tableau Goal sera utilisé pour enregistrer chaque but et vous pourrez ensuite construire des résultats de match à partir de celui-ci, en évitant l'utilisation des champs "HomeTeamScore" et "AwayTeamScore".
En ce qui concerne le tableau des statistiques, vous devez savoir qui a gagné les points, alors restons fidèles à notre structure de table finale :
Teams(id,name) Seasons(id, year,begin_date,end_date) Matches(id, date, season (外键), home_team (外键), away_team (外键), status) Goals(id,team,game,player?)
La valeur du champ d'état dans les correspondances peut être : ['1','X','2']
De cette façon, vous pouvez facilement avoir tout pour calculer vos statistiques, par exemple pour l'équipe avec l'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';
Vous pouvez l'utiliser comme point de départ pour créer une requête légèrement plus complexe en utilisant les fonctions group by et group pour calculer les statistiques de l'équipe. Une fois que vous avez créé avec succès une requête comme celle-ci, je vous recommande d'utiliser Views
D’ailleurs, ces requêtes que vous souhaitez exécuter ne sont pas lourdes, vous n’avez pas forcément besoin de triggers, pensez d’abord au design de la base de données !
P粉9532317812023-09-03 00:42:53
Un moyen beaucoup plus simple que d'utiliser des déclencheurs pour conserver des données redondantes est d'utiliser une vue, il s'agit simplement d'une somme syndicale de base :
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 );