0

我在多个赛季的多个锦标赛中有多名球员(表格:球员,锦标赛,赛季)。因此,两名球员之间的比赛必须参考特定的锦标赛和特定的赛季。

table match
    id
    season_id
    tournament_id
    player_home
    player_away

假设将球员分配到锦标赛中以获得明显的好处可能是很自然的。我可以在赛季和锦标赛之间做一个一对多的桌子(称为桌子比赛),然后为比赛和球员做一个多对多的桌子吗?

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 回答