2011-02-12 53 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