0

複数のシーズンの複数のトーナメントに複数のプレーヤーがいます (テーブル: プレーヤー、トーナメント、シーズン)。したがって、2 人のプレイヤー間の試合は、特定のトーナメントと特定のシーズンを参照する必要があります。

table match
    id
    season_id
    tournament_id
    player_home
    player_away

明らかな利益のためにプレイヤーをトーナメントに割り当てるのはおそらく自然だとしましょう。シーズンとトーナメントの間で 1 対多のテーブル (テーブル コンペティションと呼びます) を行い、その後、コンペティションとプレイヤーに対して多対多のテーブルを行うことはできますか?

table competition
    id
    season_id
    tournament_id

table competition_player
    id
    competition_id
    player_id

table match
    id
    competition_id
    player_home
    player_away

または、これを達成するためのより簡単な/より良い方法はありますか?

アドバイスをありがとう。

4

1 に答える 1

0

SqlFiddle

非常に基本的ですが、それでも関係を見ることができます。ここに。

構造

テーブル

  • プレイヤー

    --------------------------
    |Id | Name | OtherInfo   |
    --------------------------
    | 1 | John | Player Info |
    --------------------------
    | 2 |  Tom | Player Info |
    --------------------------
    
  • 季節

    -----------------------------------
    |Id | SeasonName    | SeasonInfo  |
    -----------------------------------
    |01 | MyFirstSeason | Season Info |
    -----------------------------------
    
  • トーナメント

    ------------------------------------
    | Id | SeasonId | TournamentName   |
    ------------------------------------
    |001 |    01    | MyFirstTournament|
    ------------------------------------
    
  • 出会い

    ---------------------------------------
    | Id | FirstPlayerId | SecondPlayerId |
    ---------------------------------------
    | A  |       1       |       2        |  
    ---------------------------------------
    
  • マッチ

    -----------------------------------------------
    | Id | TournamentId | EncounterId | MatchInfo |
    -----------------------------------------------
    |0001|     001      |      A      | Some Info |
    -----------------------------------------------
    

問題は、多くのキーを無料で使用していることです。一歩下がってデザインについて考える必要があります。いくつかの列を取り出したことは知っていますが、それは単なる例のためです。それらをどこに戻すかを理解していると確信しています。これらのテーブル間の関係を示したかっただけです。

クエリ

基本的な情報だけが必要であることを暗示しましょう (もう一度例として)

Select m.Id, 
t.TournamentName,
s.SeasonName, 
(SELECT pl.Name FROM Players pl 
 JOIN Encounters en ON pl.Id = en.FirstPlayerId 
 WHERE pl.Id = en.FirstPlayerId) AS [FirstPlayerName],
(SELECT pl.Name FROM Players pl 
 JOIN Encounters en ON pl.Id = en.SecondPlayerId
 WHERE pl.Id = en.SecondPlayerId) As [SecondPlayerName],
m.MatchInfo 
FROM Matchs m 
JOIN Tournaments t ON m.TournamentId = t.Id
JOIN Encounters e ON m.EncounterId = e.Id
JOIN Seasons s ON  t.SeasonId = s.Id
于 2013-05-09T17:52:17.110 に答える