2012-04-20 29 views
0

對不起,如果標題不清楚。我有點困惑於如何規劃我的數據庫架構,因爲我的數據庫設計技能水平需求屬於先進:)我真的可以在這裏使用一些幫助。無論如何,這裏...搜索可以在兩個不同列中的數據(查詢/設計)

我需要跟蹤球隊的比賽細節。爲了簡單起見,我們可以說我需要跟蹤比賽日期,比賽結果和參賽隊伍。現在,我該如何設計我的表格,以便確保返回所有相關數據,而不必保留同一匹配的多個記錄。我不確定我是否清楚地解釋,所以下面是一個例子。

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。

現在,在我所知道的基本設計中,我通常會搜索匹配的團隊名稱,然後返回結果。但是在這裏,團隊名稱可以分爲兩個不同的列,兩者都可以相關。那麼,這是我需要在設計層面上決定的事情還是可以通過某種查詢來完成的事情。

(注意:將球隊存儲爲主場/客場不適合我的要求)。

回答

2

您可以直接查詢兩列,這不是一個問題:

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

你也可以通過把球隊在各自的表只留下他們在比賽中的表ID正常化這個模式,但並沒有太大的改變,你仍然需要查詢兩個列。閱讀關於數據庫規範化的內容,任何SQL書都涵蓋了這個)。

0

這會給你你想要的結果,但也可能有更好的設計。

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

你可能想分離出來的分數如Team1Score Team2Score否則你不能輕易做數學與他們。

0

對於明星我不會存儲時間名稱,我認爲它更好,如果您將時間存儲在其他表和LINQ然後通過一個ID。

然後,您可以創建一個列ID,匹配ID和團隊ID,並在該表中搜索團隊ID!

0

您可以使用此查詢及其對你的程序沒有問題:

從YOUR_TABLE_NAME 選擇YOUR_ID_FIELDS 其中YOUR_FIELD_NAME(TEAM1)= '阿森納' 或YOUR_FIELD_NAME(TEAM2)= '阿森納';

和exmale(切爾西) 從YOUR_TABLE_NAME 選擇YOUR_ID_FIELDS 其中YOUR_FIELD_NAME(TEAM1)= '切爾西' 或YOUR_FIELD_NAME(TEAM2)= '切爾西';

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  

當然,你肯定會想採取塞爾吉奧的建議,將所有這些東西放在單獨的表格中。 「團隊」可能會有不同的屬性(家鄉,教練姓名等),而且您不想複製該數據。