Если вам нужен четкий список команд, вам придется выбирать из игрового стола дважды, объединяя домашнюю и выездную команды (теоретически, одна команда может играть во все свои игры в дороге или дома, если у вас есть логика что мешает, то вы можете настроить этот запрос):
select home_team_id as team_id from game union
select away_team_id as team_id from game
Оператор union
гарантирует, что вы получите только отдельные элементы в возвращаемом наборе (если вы не используете union all
)
Оттуда вы можете использовать левые внешние объединения для объединения ваших данных:
select
u.team_id, count(h.game_id) as home_games, count(a.game_id) as away_games
from
(
select home_team_id as team_id from game union
select away_team_id as team_id from game
) as u
left outer join game as h on h.home_team_id = u.team_id
left outer join game as a on a.away_team_id = u.team_id
group by
u.team_id
Если вы хотите еще больше сократить сканирование таблиц (приведенное выше даст четыре), вы можете добавить больше кода, но это будет стоить вам. С помощью team_id вы можете получить список строк, а также указали, играли ли вы дома или в гостях:
select
case ha.home when 0 then g.away_team_id else g.home_team_id end as team_id,
case ha.home when 0 then 0 else 1 end as home_games,
case ha.home when 0 then 1 else 0 end as away_games
from
game as g, (select 0 as home union select 1 as home) as ha
Оттуда вы можете просто подвести итоги игр дома и в гостях для каждой команды:
select
t.team_id, sum(t.home_games) as home_games, sum(t.away_games) as away_games
from
(
select
case ha.home when 0 then g.away_team_id else g.home_team_id end as team_id,
case ha.home when 0 then 0 else 1 end as home_games,
case ha.home when 0 then 1 else 0 end as away_games
from
game as g, (select 0 as home union select 1 as home) as ha
) as t
group by
t.team_id
Это приведет к сканированию одной таблицы.