将带有子查询的连接合并到现有查询中

时间:2014-10-12 16:55:16

标签: mysql sql

我有一个数据库,其中包含体育团队游戏统计数据和记录的记录,我现在遇到的问题是如何在整个赛季中找出针对团队的总分数并将其合并到一个返回他们的查询中总胜负。

我当前的查询没有显示他们的观点是:

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一起使用。

所以,我需要将第二个查询合并到第一个查询中,以便为'Points Against'添加一个列,这是第二个查询返回的。

'游戏'表中包含此数据(以及更多内容,但这与此问题相关):

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

每一行都是游戏中参与其中一个团队游戏的游戏统计数据,因此“得分”列是团队得分。因此,为了获得针对球队的积分,我需要将所有行的“得分”列与他们所玩的GameID相加,但不是来自他们行的得分,而是他们的对手排。第二个查询完成了这个。

对不起,如果这是一个非常基本的问题(我觉得我错过了一些明显的东西!),但是非常感谢任何帮助!

根据要求,这是create table语句:

表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 个答案:

答案 0 :(得分: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 ...”行。

同样,这可能是非常低效的,但确实有效!