Я думаю, что ответ Тима - очень хороший ответ.Но, предполагая, что у вас есть таблица persons
, вы можете сделать это без union all
:
select p.person_id,
(select avg(team_score)
from points po
where p.person_id in (po.person1_id, po.person2_id)
) as average_score
from persons p
order by average_score desc
limit 5; -- or whatever
Более эффективное выражение, вероятно, наиболее эффективно:
select p.person_id,
( (select sum(team_score)
from points po
where p.person_id = po.person1_id
) +
(select sum(team_score)
from points po
where p.person_id = po.person2_id
)
) /
nullif( (select count(*)
from points po
where p.person_id = po.person1_id
) +
(select count(*)
from points po
where p.person_id = po.person2_id
), 0
) as average_score
from persons p
order by average_score desc
limit 5;
Причина, по которой это более эффективно, заключается в том, что он может использовать индексы points(person1_id, team_score)
и points(person2_id, team_score)
.