Футбол SQL Query Home- и Roadteam Проблема - PullRequest
2 голосов
/ 12 сентября 2011

В футбольной среде я хочу отображать текущее положение. Значение: очки и голы за команду. Соответствующие таблицы выглядят аналогично следующему (упрощенно).

Таблица совпадений

uid  (PK)      hometeamid      roadteamid
------------------------------------------------------------------

Таблица результатов

uid (PK)      hometeamscore   roadteamscore       resulttype (45min, 90min, ..)
-------------------------------------------------------------------

Team Table

uid (PK)       name            shortname           icon
------------------------------------------------------------------

Теперь я не могу понять, как записать результаты в одном запросе. Мне удалось написать запрос, который возвращает только «домашние игры». Я думаю, это самая легкая часть. В любом случае вот как это выглядит:

SELECT  ht.name, 
        Count(*) As matches,   
        SUM(res.hometeamscore) AS goals, 
        SUM(res.roadteamscore) AS opponentgoals, 
        SUM(res.hometeamscore - res.roadteamscore) AS goalDifference,         
        SUM(res.hometeamscore > res.roadteamscore) * 3 + SUM(res.hometeamscore = res.roadteamscore) As Points

FROM league_league l

JOIN league_gameday gd
     ON gd.leagueid = l.uid

JOIN league_match m
     ON m.gamedayid = gd.uid

JOIN league_result res
     ON res.matchid = m.uid 
     AND res.resulttype = 2

JOIN league_team ht
     ON m.hometeamid = ht.uid

Where l.uid = 1

Group By ht.uid

Order By points DESC, goalDifference DESC

Любая идея, как изменить это, что он вернется домой - и роудгеймы, будет очень цениться.

Большое спасибо,
Robin

Ответы [ 2 ]

1 голос
/ 12 сентября 2011

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

Представления в MySQL - это всего лишь псевдотабличные таблицы, которые динамически вычисляются из запроса SELECT.Используя SQL в своем вопросе, вы можете создать представление результатов команд дома: CREATE VIEW homegames AS SELECT ... Затем сделайте то же самое для дорожных игр.Тогда будет легко объединить оба представления в третье (вам просто нужно сложить столбцы).

Представления имеют как минимум один недостаток: они медленные.Представление, построенное на представлениях, походит на использование сложных подзапросов, и MySQL довольно плох в этом.Я не думаю, что это проблема для вас, поскольку вы, вероятно, имеете дело с сотнями игр максимум.Но если вы обнаружите, что эти представления слишком медленные для запроса, и при условии, что вы не используете какой-либо вид кэша, который мог бы смягчить это, тогда используйте простые таблицы вместо представлений.Конечно, вам нужно будет синхронизировать их.Вы можете TRUNCATE и INSERT INTO homegames SELECT ... каждый раз, когда у вас есть новая игра, или вы можете быть умнее и просто UPDATE за столами.Оба права, в зависимости от ваших потребностей.

0 голосов
/ 12 сентября 2011

Не могли бы вы абстрагировать это в хранимую процедуру или хранимую функцию для вызова вместо создания такого сложного запроса с большой задницей?

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