2011-06-19 3 views
0

La base de données est assez simple. Ci-dessous, il y a une partie d'un schéma correspondant à cette questionBase de données de modélisation d'une petite ligue de football

  • ROND (round_id, round_number)

  • ÉQUIPE (team_id, team_name)

  • MATCH (match_id, match_date, round_id)

  • ISSUE (team_id, match_id, score)

J'ai un problème avec la requête pour récupérer des données pour tous les matches joués. La requête simple ci-dessous donne bien sûr deux lignes pour chaque match joué.

select * 
from round r 
inner join match m on m.round_id = r.round_id 
inner join outcome o on o.match_id = m.match_id 
inner join team t on t.team_id = o.team_id 

Comment écrire une requête pour avoir les données de correspondance sur une ligne?

Ou peut-être devrais-je revoir la base de données - déposer la table OUTCOME et modifier la table MATCH pour ressembler à ceci:

  • MATCH (match_id, match_date, team_away, team_home, score_away, score_home)?
+0

Ce sera très compliqué comme c'est ... Il serait probablement plus facile de garder le résultat dans la table 'MATCH', sauf si vous avez une raison de les garder séparés. À tout le moins, un drapeau home/away ou quelque chose de similaire dans la table 'OUTCOME' simplifierait grandement les choses. – jswolf19

Répondre

1

Vous pouvez presque générer le changement proposé des tables originales à l'aide d'une jointure réflexive sur outcome table:

select o1.team_id team_id_1, 
     o2.team_id team_id_2, 
     o1.score score_1, 
     o2.score score_2, 
     o1.match_id match_id 
from outcome o1 
inner join outcome o2 on o1.match_id = o2.match_id and o1.team_id < o2.team_id 

Bien sûr, l'information pour la maison et loin ne sont pas possible de générer, de sorte que votre approche proposée alternatif pourrait être mieux après tout. Notez également la condition o1.team_id < o2.team_id, qui supprime les données de correspondance symétrique redondantes (en fait, elle se débarrasse de la même ligne outcome, ce qui peut être considéré comme l'aspect le plus important).

Dans tous les cas, en utilisant cette sélection dans le cadre de votre jointure, vous pouvez générer une ligne par correspondance.

+0

Je considérais l'auto-jointure mais il semble que modifier la table de correspondance serait une meilleure solution. Parfois, c'est vraiment difficile à choisir :) – drv

+0

@drv En effet. Je me penche vers la table de match avec la solution de résultat de match moi-même. Cette approche ne conserve pas les informations sur les équipes censées jouer les unes contre les autres avant que les résultats ne soient disponibles. – vhallac

+1

@drv, vous pouvez aussi considérer les équipes dans la table de match et le résultat dans une table séparée (ie ajouter 'team_away' et' team_home' à 'MATCH' et avoir' OUTCOME' être ('match_id, score_away, score_home '' Sauf si vous avez besoin de situations où il n'y a pas deux équipes pour un match, en tout cas ... Cela pourrait provoquer des requêtes pour tous les jeux auxquels une équipe a participé, donc un drapeau home/away pourrait être meilleur si vous voulez avoir ces types de requêtes aussi bien ... – jswolf19

0

vous allez chercher 2 lignes pour tous les matchs joués mais team_id et TEAM_NAME sont différentes: - un pour la maison d'équipe - une pour l'équipe loin

de sorte que votre requête est bonne

0

Utilisation de la table de correspondance comme vous le décrivez capte la logique d'un jeu simplement et naturellement et montre en outre des équipes à la maison et à l'extérieur que votre modèle initial n'a pas. Vous pouvez ajouter l'ID rond comme clé étrangère à la table ronde et éventuellement un drapeau pour indiquer une situation d'abandon de correspondance.

0

résultat de chute. il ne devrait pas s'agir d'une table séparée, car vous avez exactement un résultat par match.

vous pouvez envisager de gérer les correspondances qui sont annulées - les scores sont peut-être null?

+0

Eh bien, j'ai aussi besoin de savoir quels matchs n'ont pas encore été joués. Donc, dans cette situation, les scores sont nuls. – drv

+0

pensé que ce pourrait être le cas. peut-être une valeur spéciale de «-1» chacun? ou pour un "walkover" (une équipe n'a pas montré), seulement cette équipe obtient "-1". Il y a quelques cas limites que vous devrez gérer. – Bohemian

Questions connexes