База данных моделирования для малой футбольной лиги - PullRequest
0 голосов
/ 19 июня 2011

База данных довольно проста. Ниже приведена часть схемы, относящаяся к этому вопросу

  • КРУГЛЫЙ (round_id, round_number)

  • КОМАНДА (team_id, team_name)

  • МАТЧ (match_id, match_date, round_id)

  • РЕЗУЛЬТАТ (team_id, match_id, score)

У меня проблема с запросом на получение данных для всех сыгранных матчей. Простой запрос ниже дает, конечно, две строки для каждого сыгранного матча.

select * 
from round r 
inner join match m on m.round_id = r.round_id 
inner join outcome o on o.match_id = m.match_id 
inner join team t on t.team_id = o.team_id

Как мне написать запрос, чтобы данные о совпадениях были в одной строке?

Или, может быть, мне следует перепроектировать базу данных - отбросить таблицу OUTCOME и изменить таблицу MATCH, чтобы она выглядела так:

  • МАТЧ (match_id, match_date, team_away, team_home, score_away, score_home)?

Ответы [ 4 ]

1 голос
/ 19 июня 2011

Вы можете почти сгенерировать предлагаемое изменение из исходных таблиц, используя самостоятельное соединение на outcome таблице:

select o1.team_id team_id_1,
       o2.team_id team_id_2,
       o1.score score_1,
       o2.score score_2,
       o1.match_id match_id
from outcome o1
inner join outcome o2 on o1.match_id = o2.match_id and o1.team_id < o2.team_id

Конечно, информацию для дома и на выезде невозможно получить, поэтому предложенный вами альтернативный подход может оказаться лучше. Кроме того, обратите внимание на условие o1.team_id < o2.team_id, которое избавляет от избыточных данных симметричного совпадения (на самом деле оно избавляется от той же строки outcome, соединяемой с самим собой, что можно рассматривать как более важный аспект).

В любом случае, используя этот выбор как часть вашего объединения, вы можете генерировать одну строку за матч.

0 голосов
/ 19 июня 2011

Использование таблицы соответствия, как вы описываете, просто и естественно отражает логику игры и дополнительно показывает домашние и выездные команды, которых нет в вашей первоначальной модели. Возможно, вы захотите добавить круглый идентификатор в качестве внешнего ключа к круглому столу и, возможно, флаг, указывающий на ситуацию, в которой прекращено совпадение.

0 голосов
/ 19 июня 2011

падение результата. это не должна быть отдельная таблица, потому что у вас есть ровно один результат на матч.

вы можете подумать, как обращаться с отмененными матчами - возможно, оценки равны нулю?

0 голосов
/ 19 июня 2011

вы выбираете 2 строки для каждого сыгранного матча, но team_id и team_name различаются: - один для команды домой - один для команды на выезде

так что ваш запрос хорош

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