Получение только одного результата за "футбольный матч" на команду в неделю - PullRequest
0 голосов
/ 25 сентября 2019

Я собираю новый проект, и одна из вещей, которые мне нужно сделать, это получить результаты матча с поддельным футболом (американским).Я делаю это в php и mysql, используя CodeIgniter в качестве моей платформы.Мой dbfiddle выглядит следующим образом:

https://www.db -fiddle.com / f / 5Q7QezddpNEGabaia2w5FQ / 0

Теперь, как вы видите, каждая команда имеет запись дляhome_team_id и away_team_id.То, что я хотел бы сделать, это запрос, который получает только ОДИН результат для каждой команды (независимо от того, дома они или нет).Я бы предпочел не обрабатывать эти данные программно, если мне не нужно.

Результаты должны быть примерно такими:

SELECT week, home_team_id, away_team_id, 
    my_score, their_score, 
    a.team_name as home_team, b.team_name as away_team 
FROM nfl_user_matchups nm 
LEFT JOIN user_teams a ON nm.home_team_id = a.user_teams_id 
LEFT JOIN user_teams b ON nm.away_team_id = b.user_teams_id 
WHERE week = 1

Ожидаемые конечные данные будут примерно такими (my_score будет счетом home_team_id, их_ценка будет оценкой away_team_id):

+------+--------------+--------------+----------+-------------+
| week | home_team_id | away_team_id | my_score | their_score |
+------+--------------+--------------+----------+-------------+
| 1    | 3            | 9            | 112      | 144         |
+------+--------------+--------------+----------+-------------+
| 1    | 7            | 2            | 85       | 96          |
+------+--------------+--------------+----------+-------------+
| 1    | 1            | 6            | 111      | 114         |
+------+--------------+--------------+----------+-------------+
| 1    | 4            | 5            | 99       | 125         |
+------+--------------+--------------+----------+-------------+
| 1    | 8            | 10           | 140      | 122         |
+------+--------------+--------------+----------+-------------+

1 Ответ

1 голос
/ 25 сентября 2019

Ваша формулировка проблемы в основном означает, что пара конкурирующих команд , а именно , (1,2) должна рассматриваться так же, как (2,1).Одним из способов удовлетворения таких требований является обеспечение того, чтобы в любом матче между этими двумя командами мы обеспечивали их одинаковый порядок.Итак, в основном мы получаем значение идентификатора команды Least() из двух команд и всегда помещаем его в первый индекс;и значение Greatest() всегда со вторым (последним) индексом.Примечательно, что Greatest() - это не то же самое, что Max().Max() функция вычисляет максимум по столбцу;в то время как Greatest() - это , обычно , используемый для сравнения значений в строке.

Теперь мы можем просто GROUP BY в этой паре и вычислить агрегаты по желанию.При определении домашнего / выездного счёта вам нужно будет использовать выражение CASE .. WHEN, чтобы определить, имеет ли наименьший номер дома идентификатор наименьшего, или отсутствующий идентификатор:

SELECT 
  week, 
  LEAST(home_team_id, away_team_id) AS home_id, 
  GREATEST(home_team_id, away_team_id) AS away_id, 
  MAX(CASE 
      WHEN LEAST(home_team_id, away_team_id) = home_team_id 
      THEN my_score 
      ELSE their_score
      END) AS home_score,
  MAX(CASE 
      WHEN GREATEST(home_team_id, away_team_id) = away_team_id 
      THEN their_score 
      ELSE my_score
      END) AS away_score 
FROM nfl_user_matchups 
WHERE week = 1
GROUP BY
  week, 
  home_id, 
  away_id;

Просмотр в БДFiddle

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...