2011-02-12 92 views
1

我一直在困惑如何構建一個特殊的查詢,我能找到的最好的是它必須是某種複雜的子查詢系統。MySQL加入三個表和平均

雖然我不完全確定。

我有三個表,teams,matchesscored

teams表中包含團隊編號和相應團隊名稱的列表。

matches表中包含一個列表記錄了匹配結果(每場比賽每隊一場)和相應的球隊號碼。

scored表中包含有關團隊所做的每個分數的所有信息以及相應的匹配結果id的列表。

┌────────────┐ 
| TEAMS  | 
├────────────┤ 
│ teamnumber | 
│ teamname | 
└────────────┘ 

┌───────────────┐ 
| MATCHES  | 
├───────────────┤ 
│ teamnumber | 
│ matchresultid | 
└───────────────┘ 

┌───────────────┐ 
| SCORED  | 
├───────────────┤ 
│ matchscoredid | 
│ matchresultid | 
└───────────────┘ 

給定一個teamnumber,我需要在每scoredmatchresultid的平均數量。我會怎麼做?

+0

我越是看這更困惑我成爲。每匹配的平均行數甚至意味着什麼?每個matchresultid只有一個得分記錄。你如何平均一個號碼? –

回答

3

我覺得你離開了,可能具有迷惑別人的一個元素是遊戲中一個給定團隊的實際成績來代替「數」反對。所以基本上你想要一個團隊,並在賽季的過程中,你如果想所有球隊平均的比較,希望他們取得了平均分#...

select 
     t.teamnumber, 
     t.teamname, 
     avg(s.totalpoints) TeamAvgPoints 
    from 
     teams t 
     join matches m 
      on t.teamnumber = m.teamnumber 
      join scored s 
       on m.matchresultid = s.matchresultid 
    where 
     t.teamnumber = SomeValue 

,忽略WHERE子句,只是做一組由...

group by 
     t.teamnumber, 
     t.teamname 

如果得分表中有每場比賽多行,則預聚合需要每場比賽做首先共有點,則獲得平均...像

select 
     PreQuery.TeamNumber, 
     PreQuery.TeamName, 
     avg(ifnull(PreQuery.MatchTotalPoints, 0)) AvgPerGame 
    from 
     (select 
      t.teamnumber, 
      t.teamname, 
      m.matchresultid, 
      count(*) MatchTotalPoints 
     from 
      teams t 
       left join matches m 
        on t.teamnumber = m.teamnumber 
        left join scored s 
        on m.matchresultid = s.matchresultid 
     where 
      t.teamnumber IN(SomeValue, AnotherValue, MoreValues, EtcValue) 
     group by 
      t.teamnumber, 
      t.teamname, 
      m.matchresultid) PreQuery 
    group by 
     PreQuery.TeamNumber, 
     PreQuery.TeamName 

在本版本的查詢中,如果您想比較所有團隊,請刪除特定團隊的內部WHERE子句,然後將團隊應用到團隊編號和團隊名稱的OUTER查詢中。

要獲取額外的預選賽整個列表,我已經改變到左連接,並完成了對於一般的IFNULL()...

+0

然而,如果一個團隊沒有玩過任何遊戲,每個結果列都是NULL,這個答案是最接近的。 – skeggse

+0

@CMC,所以我已經更改爲左連接,所以它仍然會得到團隊,但點數將爲空。那麼在最外面,我應用了IFNULL()來使用零...給它一個 – DRapp

+0

非常好,謝謝! – skeggse

0

試試這個:

SELECT s.matchresultid, count(*) 
FROM scored s 
JOIN matches m 
ON m.matchresultid = s.matchresultid 
WHERE m.teamnumber = your_team_number 
GROUP BY s.matchresultid 
0
SELECT a.teamname team, b.matchresultid match, COUNT(c.matchscoredid) scores 
FROM teams a, matches b, scored c 
WHERE a.teamnumber = b.teamnumber AND b.matchresultid = c.matchresultid; 

應該返回分數的數量每場比賽每隊。

1

您是否需要分數或平均得分?如果你需要的分數平均,則需要以「平均」

SELECT s.matchresultid, COUNT(s.matchscoredid) 
    FROM matches m INNER JOIN scored s ON m.matchresultid = s.matchresultid 
WHERE m.teamnumber = <team> 
GROUP BY s.matchresultid