数据库非常简单。下面是与此问题相关的架构的一部分
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_id, match_date, team_away, team_home, score_away, score_home
)?答案 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)
放弃结果。它不应该是一个单独的表,因为每个匹配只有一个结果。
您可以考虑如何处理被取消的匹配 - 也许得分为空?