SQL:来自两个不同表

时间:2018-03-21 16:22:37

标签: sql

没有想要这样做(寻求帮助)但是我很难过......

我正在编写曲棍球池计划,其中一项功能是计算所有玩家(守门员和滑冰者)的每周积分总数"玩"对于特定的游泳池团队。

我有3张桌子。

    **PoolTeams** 
PoolTeamID      PoolTeamName
----------      ------------ 
1               Team A 
2               Team B 
3               Team C

**MondaySkaterStats**
Player      Weeknumber       PoolTeam        PTS       Status
------      ----------       --------        ---       ------
10          1                1               15        True
11          2                1               3         False
13          3                2               5         True
40          1                1               3         True
41          2                1               5         False
43          3                2               1         True

**MondayGoalieStats** 
Player           Weeknumber       PoolTeam        PTS       Status
------           ----------       --------        ---       ------ 
20               1                3               4         False 
21               2                1               3         True 
22               3                2               5         False
50               1                3               4         False 
51               2                1               3         True 
52               1                1               7         True

实际的数据库要大得多,为了清晰起见,我已经截断了。

此外,MondayGoalieStats表还有一些额外的列与结果的结果无关。

所以,让我们说,我想总结一下所有参赛队员的积分,这些队员的状态为TRUE且我只对第一周感兴趣的每个泳池队(滑冰者和守门员)。

这是我提出的SQL查询。在总结MondaySkaterStats积分时它很有用,但无论出于什么原因,它似乎都没有在MondayGalieStats表中正确总结积分。 我决定选择INNER JOIN,因为Player和Goalie表并不完全相同。我用Weeknumber作为两者之间的共同点。

SELECT PT.PoolTeamName, SUM(MS.PTS) AS PlayerSum, SUM(MG.PTS) as GoalieSum
FROM PoolTeams PT, MondaySkaterStats MS 
INNER JOIN MondayGoalieStats MG ON (MS.Weeknumber=MG.Weeknumber) 
WHERE MS.Weeknumber=1 
AND PT.PoolTeamID = MS.PoolTeam 
AND MS.PoolTeam = MG.PoolTeam 
AND MS.Status = True 
AND MG.Status = True
GROUP BY PT.PoolTeamName

非常感谢任何帮助....谢谢!

1 个答案:

答案 0 :(得分:2)

您可以使用UNION创建中间表,并为每个表添加标签以保持位置分离。 然后,您可以按团队和职位分组。这将导致每个团队2行,每个职位1行。 最后,JOIN PoolTeam表格以显示PoolTeamName

(不同的引擎会有不同的语法;我习惯使用MySQL)

SELECT PoolTeams.PoolTeamName, SUM(Pts), position FROM
(
    SELECT PoolTeam, Pts, "Skater" as position 
        FROM MondaySkaterStats WHERE Status = "True" AND WeekNumber = 1
    UNION ALL
    SELECT PoolTeam, Pts, "Goalie" as position 
        FROM MondayGoalieStats WHERE Status = "True" AND WeekNumber = 1
) table_alias

LEFT JOIN PoolTeams ON table_alias.PoolTeam = PoolTeams.PoolTeamID

GROUP BY PoolTeam, position;

从长远来看,它可以帮助您的数据库设计将这两个表规范化为1,可能还有一个辅助表,用于特殊守门员字段。

MondayPlayerStats     ExtraGoalieStats
-----------------     ----------------
Id                ->  MondayPlayerId
Pts                   Blocks
Status                ... whatever
WeekNumber
Position (goalie, etc)
... etc