php / mysql - расчеты по результатам матчей (цели)

0

У меня есть база данных со всеми матчами футбола из сезона, и я хочу сделать некоторые простые вычисления с результатами. Это выглядит так:

+----------+----------+---------------+---------------+--+
| HomeTeam | AwayTeam | HomeTeamGoals | AwayTeamGoals |  |
+----------+----------+---------------+---------------+--+
| team1    | team2    |             3 |             1 |  |
| team3    | team4    |             1 |             2 |  |
| team1    | team3    |             4 |             4 |  |
| team4    | team2    |             0 |             1 |  |
+----------+----------+---------------+---------------+--+

Теперь я хочу рассчитать 4 вещи для каждой команды:
- общее количество голов, забитых в домашних играх
- общее количество голов, забитых в выездных играх
- общие цели против домашних игр
- общие цели против в выездных играх

С помощью этого запроса я получаю всю информацию для домашних игр правильно:

SELECT HomeTeam, SUM(HomeTeamGoals) as HomeTeamGoals, SUM(AwayTeamGoals) as AwayTeamGoals
FROM games
GROUP BY HomeTeam

Но как мне теперь получить информацию для гостевых игр (из того же запроса)?

Результаты должны быть следующими с данными из приведенной выше таблицы:

+-------+----------+--------------+----------+--------------+
| team  | home for | home against | away for | away against |
+-------+----------+--------------+----------+--------------+
| team1 |        7 |            5 |        0 |            0 |
| team2 |        0 |            0 |        2 |            3 |
| team3 |        1 |            2 |        4 |            4 |
| team4 |        0 |            1 |        2 |            1 |
+-------+----------+--------------+----------+--------------+
  • 0
    в общей таблице нет полей FTHG или FTAH. Запрос не соответствует таблице
  • 0
    @LelioFaieta Мой плохой, сейчас исправлено в запросе.
Показать ещё 3 комментария
Теги:
group-by
sum

2 ответа

1
Лучший ответ

Попробуйте это с объединением всех:

https://dbfiddle.uk/?rdbms=mysql_8.0&fiddle=1a1bbfadd62ed68808605a9e7767870d

select hometeam, sum(HomeTeamGoals) as homefor,sum(AwayTeamGoals) as homeagainst, 0 as awayfor, 0 as awayagainst from tablename
group by hometeam

union all

select AwayTeam, 0,0, sum(HomeTeamGoals) as awayfor, sum(AwayTeamGoals) as awayagainst from tablename
group by AwayTeam

Выход:

hometeam    homefor homeagainst awayfor awayagainst
team1       7       5            0      0
team4       0       1            0      0
team2       0       0            3      2
team3       0       0            4      4
  • 0
    Привет Fa06! Я получаю все правильные данные обратно, так что это прекрасно! Спасибо за это. Есть одна проблема с печатью данных, теперь он показывает список со всеми командами дважды, один список со всеми домашними данными и один со всеми выездными данными. Это нормально с тем, как мы это сделали сейчас?
  • 0
    Вот код, который я использую для печати данных: phpfiddle.org/main/code/qg3k-5u8t
0

Вы можете попробовать это

вход:

create table goals(
homeTeam varchar(10),
awayTeam varchar(10),
homeTeamGoals tinyint,
awayTeamGoals tinyint
);
insert into goals values('team1','team2',3,1),('team3','team4',1,2),('team1','team3',4,4),('team4','team2',0,1);

Изображение 174551

Выход:

select totalTeams.team as hometeam,
  case when a.totalHomeGoals IS NULL THEN 0 ELSE a.totalHomeGoals END as totalHomeGoals,
  case when a.totalHomeAgainstGoals IS NULL THEN 0 ELSE a.totalHomeAgainstGoals END as totalHomeAgainstGoals,
  case when b.totalAwayGoals IS NULL THEN 0 ELSE b.totalAwayGoals END as totalAwayGoals,
  case when b.totalAwayAgainstGoals IS NULL THEN 0 ELSE b.totalAwayAgainstGoals END as totalAwayAgainstGoals
      from (select homeTeam as team from goals union select awayTeam from goals) as totalTeams 
      left join (select homeTeam as team, sum(homeTeamGoals) as totalHomeGoals,sum(awayTeamGoals) as totalHomeAgainstGoals from goals group by hometeam) as a on totalTeams.team=a.team
      left join (select awayTeam as team,sum(awayTeamGoals) as totalAwayGoals,sum(homeTeamGoals) as totalAwayAgainstGoals from goals group by awayTeam) as b on totalTeams.team=b.team 
      order by hometeam ;

Изображение 174551

  • 0
    Да, это работает также: D Спасибо!

Ещё вопросы

Сообщество Overcoder
Наверх
Меню