搜索可以在两个不同列中的数据(查询/设计)

时间:2012-04-20 22:03:10

标签: mysql database database-design

如果标题不清楚,请注意。我对如何规划数据库模式感到有点困惑,因为我的数据库设计技能水平要求属于高级版本:)我真的可以在这里使用一些帮助。无论如何,这里...... ...

我需要跟踪球队的比赛详情。为简单起见,我想说我需要跟踪比赛日期,结果以及参加比赛的球队。现在,我如何设计我的表,以便确保返回所有相关数据,而不必保留相同匹配的多个记录。我不确定我是否要清楚解释,所以下面是一个例子。

match_id    team1             team2    result
________    ________    ________     ________
1           Arsenal          Chelsea    5-3
2           Manchester Utd   Arsenal    1-0
3           Liverpool        Newcastle  2-0
4           Arsenal          Everton    1-0

根据这些数据,如果我搜索阿森纳队比赛的match_ids,我应该得到以下结果, 1,2,4。

现在,在我所知道的基本设计中,我通常会搜索团队名称中匹配的团队名称并返回结果。但是这里的团队名称可以在两个不同的列中,两者都可以相关。所以,我需要决定设计水平还是可以通过某种查询来完成的事情。

(注意:根据我的要求,将球队作为主场/客场进行存储不是一种选择。)

5 个答案:

答案 0 :(得分:2)

你可以只查询两列,这不是问题:

select match_id
from matches
where team1 = 'Arsenal' or team2 = 'Arsenal';

你也可以通过将团队放在他们的单独表中并将他们的id留在匹配表中来规范化这个模式,但是这个变化不大,你仍然需要查询两个列。阅读数据库规范化,任何SQL书都涵盖了这个)。

答案 1 :(得分:1)

如果每场比赛总共有两支队伍,那么我认为你在这里做得很好,在查询特定团队时,你会想要搜索一列或另一列(SELECT match_id FROM matches WHERE team1 = "?" OR team2 = "?")。

但需要注意的是:我肯定会将得分分成两列:

match_id  team1           team2      score1  score2
________  ______________  _________  ______  ______
1         Arsenal         Chelsea    5       3
2         Manchester Utd  Arsenal    1       0
3         Liverpool       Newcastle  2       0
4         Arsenal         Everton    1       0

这样,如果需要,您可以稍后查询分数。 (例如Big wins = SELECT match_id FROM matches WHERE ABS(score1 - score2) > 3;

如果每场比赛有两支以上的球队,那么你拥有的另一个选项应该更具可扩展性。如果是这种情况,那么您可能希望删除match_id上的唯一性约束,并将团队/得分列从2减少到1:

match_id    team            score
________    ________        ____
1           Arsenal         5
1           Chelsea         3
2           Manchester Utd  1
2           Arsenal         0
3           Liverpool       2
3           Newcastle       0
4           Arsenal         1
4           Everton         1       

当然,你肯定会想要把塞尔吉奥的建议放在单独的表格中。 “团队”可能会有不同的属性(家乡,教练名称等),你不会想要复制这些数据。

答案 2 :(得分:0)

这将为您提供所需的结果,但也可能有更好的设计。

Select * 
from table 
where (team1 = 'ARSENAL' or Team2 = 'ARSENAL')

您可能希望将Team1Score Team2Score等分数分开,否则您无法轻松地使用它们进行数学计算。

答案 3 :(得分:0)

对于明星我不会存储时间名称,我认为如果将时间存储在其他表中并且linq然后通过id存储它会更好。

然后你可以创建一个包含列id,匹配id和团队ID的表,然后只搜索该表中的团队ID!

答案 4 :(得分:0)

您可以使用此查询,对您的程序没问题:

选择YOUR_ID_FIELDS 来自YOUR_TABLE_NAME 其中YOUR_FIELD_NAME(team1)='阿森纳'或YOUR_FIELD_NAME(team2)='阿森纳';

和exmale(切尔西) 选择YOUR_ID_FIELDS 来自YOUR_TABLE_NAME 其中YOUR_FIELD_NAME(team1)='切尔西'或YOUR_FIELD_NAME(team2)='切尔西';