2011-06-19 54 views
0

數據庫非常簡單。下面有相關與這個問題爲一個小型足球聯盟建模數據庫

  • ROUND(round_id, round_number

  • TEAM(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)?
+0

這樣會很麻煩......將結果保留在「MATCH」表格中可能是最容易的,除非您有理由將它們分開。至少,OUTCOME表中的home/away標誌或類似的東西可以大大簡化事情。 – jswolf19

回答

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行,這可以被視爲更重要的方面)。

在任何情況下,使用此選擇作爲連接的一部分,您可以爲每個匹配生成一行。

+0

我正在考慮自加入,但似乎修改匹配表將是一個更好的解決方案。有時真的很難選擇:) – drv

+0

@drv確實。我正在向自己的比賽結果解決方案傾斜比賽表。這種方法並沒有保留關於哪些球隊在結果可用之前相互對抗的信息。 – vhallac

+1

@drv,你也可以考慮讓比賽表中的球隊和單獨表格中的結果得分(即,將'team_away'和'team_home'添加到'MATCH'並且具有'OUTCOME'('match_id,score_away,score_home '),除非你需要沒有兩支球隊進行比賽的情況,無論如何......這可能會導致球隊對所有比賽的查詢,儘管如此,如果你想要一個主場/客場的國旗可能會更好有這些類型的查詢以及... – jswolf19

0

你取2行的打每場比賽,但TEAM_ID和TEAM_NAME有型動物: - 一個用於球隊主場 - 一個爲球隊客場

所以你的查詢是好

0

使用匹配表如你所描述的那樣簡單而自然地捕捉遊戲的邏輯,並且顯示你的初始模型沒有的主隊和客隊。 您可能想要將圓形ID作爲外鍵添加到圓桌,也可能是標記以指示放棄匹配的情況。

0

下降結果。它不應該是一個單獨的表格,因爲每場比賽你只有一個結果。

你可能會考慮如何處理取消的比賽 - 也許比分爲空?

+0

那麼,我也需要知道哪些比賽尚未完成。所以在這種情況下,分數爲零。 – drv

+0

認爲可能是這種情況。也許是每個'-1'的特殊值?或者「走完」(一隊沒有出現),只有那個隊得到'-1'。有幾個邊緣情況需要處理。 – Bohemian