为小型足球联赛建模数据库

时间:2011-06-19 10:51:15

标签: sql database-design postgresql

数据库非常简单。下面是与此问题相关的架构的一部分

  • ROUND(round_id, round_number

  • 团队(team_id, team_name

  • MATCH(match_id, match_date, round_id

  • 结果(team_id, match_id, score

我遇到查询问题,无法检索所有比赛的数据。下面的简单查询当然为每次比赛提供了两行。

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

如何编写查询以将匹配数据放在一行?

或者我应该重新设计数据库 - 删除OUTCOME表并修改MATCH表如下所示:

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

4 个答案:

答案 0 :(得分:1)

您几乎可以使用outcome表上的自联接从原始表生成建议的更改:

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

当然,主页和离家的信息无法生成,因此您建议的替代方法可能会更好。另外,请注意条件o1.team_id < o2.team_id,它消除了冗余的对称匹配数据(实际上它除去了与自身连接的相同outcome行,这可以被视为更多重要方面)。

在任何情况下,使用此选择作为联接的一部分,您可以为每个匹配生成一行。

答案 1 :(得分:0)

每次播放的比赛都会获得2行,但team_id和team_name是不同的: - 一个团队的家 - 一个团队远离

所以你的查询很好

答案 2 :(得分:0)

在您描述的情况下使用匹配表可以简单而自然地捕捉游戏的逻辑,并且还可以显示您的初始模型没有的主队和客队。 您可能希望将圆形id作为外键添加到圆桌,也可能是一个标志,以指示匹配放弃的情况。

答案 3 :(得分:0)

放弃结果。它不应该是一个单独的表,因为每个匹配只有一个结果。

您可以考虑如何处理被取消的匹配 - 也许得分为空?