MySQL加入三个表和平均值

时间:2011-02-12 23:45:23

标签: sql mysql subquery

我一直在困惑如何构建一个特殊的查询,我能弄清楚的最好的是它必须是某种复杂的子查询系统。

但是,我并不完全确定。

我有三个表,teamsmatchesscored

teams表包含团队编号和相应团队名称的列表。

matches表包含一个记录匹配结果的列表(每个匹配每队一行),以及相应的团队编号。

scored表包含有关团队每个得分的所有信息列表,以及相应的匹配结果ID。

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

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

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

给定一个团队编号,我需要获得scoredmatchresultid行的平均行数。我该怎么做?

4 个答案:

答案 0 :(得分: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子句,并按groupnumber和teamname将该组应用于OUTER查询。

为了获得整个列表的额外限定符,我已经更改为LEFT连接,并完成了IFNULL()的平均值...

答案 1 :(得分:1)

您需要分数还是分数平均值?如果您需要平均分数,则需要将“count”替换为“avg”

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

答案 2 :(得分: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

答案 3 :(得分: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;

这应该返回每场比赛每队的得分数。