2013-11-02 34 views
0

我有一張表和一個遊戲列表,它有團隊ID和遊戲中的分數。用於獲取2隊比賽記錄的SQL語句

這是表結構。

ID HOMETEAM HOMETEAMSCORE AWAYTEAM AWAYTEAMSCORE 
  • 各隊在一場比賽中得分將在各列。
  • 當比賽沒有開始時,兩隊的比分都是0。
  • 當比賽結束時,沒有比賽可以有0-0比分。

我需要獲得2個特定團隊的遊戲記錄。例如,對於球隊1和球隊2,我需要輸出爲1-3,這意味着球隊1贏得了一次對陣球隊2,球隊2贏得了3次球隊1的衝擊。

我正在使用下面的SQL它在一定程度上起作用。但是我需要爲0-0還沒有開始的比賽輸出(比分0-0)。

SELECT least(homeTeam, awayTeam) team1, 
     greatest(homeTeam, awayTeam) team2, 
     sum(case when awayTeam > homeTeam 
      then case when homeTeamScore > awayTeamScore then 1 else 0 end else case when homeTeamScore > awayTeamScore then 0 else 1 end 
     end) team1Wins, 
     sum(case when hometeam > awayteam 
      then case when homeTeamScore > awayTeamScore then 1 else 0 end else case when homeTeamScore > awayTeamScore then 0 else 1 end 
     end) team2Wins 
FROM ow_sports_games 
GROUP BY least(homeTeam, awayTeam), 
     greatest(homeTeam, awayTeam) 

還有沒有更好的方法來有更好的SQL以外的呢?

SQL小提琴:http://sqlfiddle.com/#!2/10326/4/1

編輯:

一些樣本數據來解釋我的要求的詳細信息:

HOMETEAM HOMETEAMSCORE AWAYTEAM AWAYTEAMSCORE 
18   1    22    0 
22   2    18    1 
18   3    22    2 
12   0    13    0 

對於球隊18,22輸出應該是2-1,因爲18隊有2勝,22隊有1勝。

對於球隊12和13,輸出應該是0-0,因爲沒有比賽完成。

輸出樣本解釋總體情況:

HomeTeam  AwayTeam  Records 
18    22   2-1 
22    18   1-2 
12    13   0-0 
+0

快速瀏覽後,‘或’WHERE awayteamscore> 0或hometeamscore> 0也許應該被取代, –

+0

號。一場比賽的比分可以是3-0,在這種情況下,AND將會n不要認爲那個遊戲是有效的。不考慮只有0-0的比賽成績。 – Purus

+0

我其實不明白你的問題:)你是否想過使用NULL來區分0分和即將到來的遊戲? –

回答

1

這是你輸出相匹配的問題陳述(第3列是相同的,後兩種排序,並確保我考慮到,當他們的避風港「T發揮,但有一個記錄。見http://sqlfiddle.com/#!2/10326/43

SELECT DISTINCT hometeam, awayteam 
    , CONCAT(IF(hometeam = LEAST(hometeam, awayteam),team1wins, team2wins),' - ', IF(awayteam = LEAST(hometeam, awayteam),team1wins, team2wins)) AS Head2HeadRecord 
    , CONCAT(LEAST(hometeam, awayteam), GREATEST(hometeam, awayteam)) AS surrogateSort 
    , notplayed 
FROM ow_sports_games 
JOIN (SELECT LEAST(hometeam, awayteam) AS team1 
     ,GREATEST(hometeam, awayteam) AS team2 
     ,SUM(IF(LEAST(hometeam, awayteam) = hometeam AND homeTeamScore > awayTeamScore, 1, 
       IF(LEAST(hometeam, awayteam) = awayteam AND awayTeamScore > homeTeamScore,1,0) 
      ) 
      ) AS team1Wins 
     ,SUM(IF(GREATEST(hometeam, awayteam) = hometeam AND homeTeamScore > awayTeamScore, 1, 
       IF(GREATEST(hometeam, awayteam) = awayteam AND awayTeamScore > homeTeamScore,1,0) 
      ) 
      ) AS team2Wins 
     ,SUM(IF(homeTeamScore=0 AND awayTeamScore=0,1,0)) AS notPlayed 
     FROM ow_sports_games 
     GROUP BY team1, team2) AS trecords 
    ON LEAST(hometeam, awayteam) = team1 
    AND GREATEST(hometeam, awayteam) = team2 
ORDER BY surrogateSort, hometeam,awayteam; 
+0

哇..它看起來真的很接近..偉大的爵士:)但是當我添加一個0-0的分數的新遊戲,它不會出來..請參考http://sqlfiddle.com/#!2/2cbe6/1如果隊伍12和13(源表中新的最後一行)有一場比賽。這不會顯示在輸出中。除此之外,你的SQL搖擺不定。 – Purus

+0

什麼時候WHERE條款被刪除 – AgRizzo

+0

太好了。它像一個魅力。我會用我的實際數據進行測試並接受這個答案。 – Purus