2014-10-12 2 views
0

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

Текущий запрос у меня есть, не показывать свои очки против является:

SELECT league_team_data.`Team Name` AS TeamName, league_team_data.TeamID, games.Result, count(*) AS Total, sum(case when games.`Result` = 'WIN' then 1 else 0 end) GamesWon, sum(case when games.`Result` = 'LOSS' then 1 else 0 end) GamesLost, sum(case when games.`Result` = 'WIN' then 2 when games.`Result` = 'TIE' then 1 else 0 end) Points, SUM(Score) PointsFor 
       FROM league_team_data 

       LEFT JOIN games 
       ON games.TeamID = league_team_data.TeamID 

       INNER JOIN teams_in_divisions 
       ON teams_in_divisions.DivisionID_FK = 2 AND games.TeamID = teams_in_divisions.TeamID_FK 

       GROUP BY TeamID 
       ORDER BY PointsFor DESC, Points DESC 

«2» жёстко здесь оставаться жёстко, как это работает для его цели.

Запрос, который возвращает их общее количество очков против является:

SELECT SUM(Score) FROM `games` WHERE TeamID <> 1 AND 
GameID IN (SELECT GameID FROM games WHERE TeamID = 1) 

«1» зашиты здесь должно быть изменено, чтобы работать с league_team_data.TeamID из приведенного выше запроса.

Итак, мне нужно включить второй запрос в первый, чтобы добавить столбец «Очки против», что и возвращает второй запрос.

В таблице "игр есть эти данные (и больше, но это то, что имеет отношение к этому вопросу):

GameID | TeamID | Score | 
    1  3  20 
    1  5  28 

Каждая строка статистика игры от игры для одной из команд, участвующих в игра, так что столбец «Оценка» - это то, что команды забивают. Итак, для того, чтобы получить очки против команды, мне нужно суммировать столбец «Оценка» для всех строк с GameID, в котором они играли, но не оценка из их строки, а их ряд противников. Второй запрос выполняет это.

Извините, если это действительно основной вопрос (я чувствую, что мне не хватает чего-то очевидного!), Но любая помощь будет очень оценена!

В соответствии с просьбой, здесь создают высказывания стола:

Таблица league_team_data:

CREATE TABLE `league_team_data` (
`TeamID` mediumint(10) NOT NULL AUTO_INCREMENT, 
`Team Name` varchar(50) DEFAULT NULL, 
`Team Name Short` varchar(50) DEFAULT NULL, 
`Team Name Initials` varchar(10) DEFAULT NULL, 
`Team Background Image` varchar(100) DEFAULT NULL, 
`Team Logo` varchar(100) DEFAULT NULL, 
PRIMARY KEY (`TeamID`) 
) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=utf8 

Настольные игры:

CREATE TABLE `games` (
`Game Date` date NOT NULL, 
`GameTime` time NOT NULL, 
`GameID` mediumint(10) NOT NULL, 
`TeamID` mediumint(10) NOT NULL, 
`Team` varchar(50) NOT NULL, 
`Score` int(5) NOT NULL, 
`Result` varchar(5) NOT NULL, 
`Home Team` varchar(50) NOT NULL, 
`HomeTeamID` mediumint(10) NOT NULL, 
`Away Team` varchar(50) NOT NULL, 
`AwayTeamID` mediumint(10) NOT NULL, 
`Game Status` varchar(10) NOT NULL, 
`SeasonID` int(10) NOT NULL, 
PRIMARY KEY (`GameID`,`TeamID`), 
CONSTRAINT `FK_gameid` FOREIGN KEY (`GameID`) REFERENCES `league_games` (`GameID`) ON DELETE NO ACTION ON UPDATE CASCADE 
) ENGINE=InnoDB DEFAULT CHARSET=utf8 

Таблица teams_in_divisions:

CREATE TABLE `teams_in_divisions` (
`DivisionID_FK` mediumint(10) NOT NULL, 
`TeamID_FK` mediumint(10) NOT NULL, 
UNIQUE KEY `DivisionID_TeamID` (`DivisionID_FK`,`TeamID_FK`), 
KEY `TeamID_FK` (`TeamID_FK`), 
CONSTRAINT `teams_in_divisions_ibfk_2` FOREIGN KEY (`TeamID_FK`) REFERENCES `league_team_data` (`TeamID`), 
CONSTRAINT `teams_in_divisions_ibfk_1` FOREIGN KEY (`DivisionID_FK`) REFERENCES `league_divisions` (`DivisionID`) 
) ENGINE=InnoDB DEFAULT CHARSET=utf8 
+1

Просьба представить несколько примеров вместе с инструкциями 'CREATE TABLE' ... – Benvorth

+0

@Benni Вы хотите создать таблицу для таблицы« игр »или всех таблиц? Я не уверен, что вы хотите для образцов, но я был бы рад предоставить все, что поможет, если вы сможете уточнить, что вы имеете в виду. –

+1

@JonEvans Вы можете отредактировать свой вопрос!Кстати, не лучше ли хранить результат (т. Е. Оценка) прибора, а не выиграть и т. Д.? – Strawberry

ответ

0

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

Мне просто нужно было добавить подзапрос непосредственно в исходный оператор SELECT. Вот окончательный код:

SELECT league_team_data.`Team Name` AS TeamName, 
league_team_data.TeamID, games.Result, count(*) AS Total, 
sum(case when games.`Result` = 'WIN' then 1 else 0 end) GamesWon, 
sum(case when games.`Result` = 'LOSS' then 1 else 0 end) GamesLost, 
sum(case when games.`Result` = 'WIN' then 2 when games.`Result` = 'TIE' then 1 else 0 end) Points, 
SUM(Score) PointsFor, 
(SELECT SUM(Score) AS PointsAgainst FROM `games` WHERE TeamID <> league_team_data.TeamID AND GameID IN (SELECT GameID FROM games WHERE TeamID = league_team_data.TeamID)) AS PointsAgainst 

FROM league_team_data 

LEFT JOIN games ON games.TeamID = league_team_data.TeamID 

INNER JOIN teams_in_divisions ON teams_in_divisions.DivisionID_FK = 1 AND games.TeamID = teams_in_divisions.TeamID_FK 

GROUP BY TeamID ORDER BY Points DESC 

Часть Я добавил был "SELECT SUM (Score) AS PointsAgainst ..." линия.

Опять же, это может быть ужасно неэффективным, но оно действительно работает!

+1

Как бы то ни было, этот ответ полезен только вам, потому что никто не понимает вашу схему (если только они не читают комментарии выше - маловероятно) – Strawberry

+0

@Strawberry. Должен ли я добавить весь код CREATE TABLE для всех таблиц? Я бы хотел, чтобы это было полезно для всех. Это говорит о том, что простая возможность добавить еще один запрос SELECT в существующий запрос SELECT так, как я это делал, - это все, что мне действительно нужно знать, и если у кого-то другого была подобная проблема, это не решило бы его? –

+1

Это зависит от вас. Если бы это был я, я бы это сделал. – Strawberry

Смежные вопросы