我一直在困惑如何构建一个特殊的查询,我能弄清楚的最好的是它必须是某种复杂的子查询系统。
但是,我并不完全确定。我有三个表,teams
,matches
和scored
。
teams
表包含团队编号和相应团队名称的列表。
matches
表包含一个记录匹配结果的列表(每个匹配每队一行),以及相应的团队编号。
scored
表包含有关团队每个得分的所有信息列表,以及相应的匹配结果ID。
┌────────────┐
| TEAMS |
├────────────┤
│ teamnumber |
│ teamname |
└────────────┘
┌───────────────┐
| MATCHES |
├───────────────┤
│ teamnumber |
│ matchresultid |
└───────────────┘
┌───────────────┐
| SCORED |
├───────────────┤
│ matchscoredid |
│ matchresultid |
└───────────────┘
给定一个团队编号,我需要获得scored
每matchresultid
行的平均行数。我该怎么做?
答案 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;
这应该返回每场比赛每队的得分数。