繁体   English   中英

MySQL从2个子查询中除以值

[英]MySQL divide by values from 2 subqueries

表结构如下:

Players (PlayerID, FirstName, LastName, PositionID)
Salaries (SalaryID, PlayerID, Amount)
ScoredGoals (GoalId, PlayerID, GameID, Minute)
Positions (PositionID, PositionName)

我需要找到每个职位每个目标支付的薪水。 此查询产生正确的结果,但我想知道是否有更有效的方法来执行此操作。 任何帮助表示赞赏!

SELECT g.PositionName, 
(s.AvgSalPerPosition / g.GoalsPerPosition) as SalPerGoalPerPosition
FROM
    (#TOTAL GOALS PER POSITION
    SELECT po.PositionName, 
    po.PositionID,
    COUNT(GoalID) as GoalsPerPosition
    FROM ScoredGoals sg
    JOIN Players p ON sg.PlayerID = p.PlayerID 
    JOIN Positions po ON p.PositionID = po.PositionID
    GROUP BY po.PositionID) g
JOIN
    (#AVG SALARY PER POSITION
    SELECT po.PositionID, 
    AVG(Amount) as AvgSalPerPosition
    FROM Positions po
    JOIN Players p ON po.PositionID = p.PositionID
    JOIN Salaries s ON p.PlayerID = s.PlayerID
    GROUP BY po.PositionID) s ON g.PositionID = s.PositionID

通过将第二个子查询与第​​一个子查询中的表连接起来,可以仅使用一个子查询而不是2来执行此操作。

SELECT po.positionName, s.avgSalPerPosition/COUNT(*) AS salPerGoalPerPosition
FROM ScoredGoals sg
JOIN Players p ON sg.PlayerID = p.PlayerID 
JOIN Positions po ON p.PositionID = po.PositionID
JOIN (
    SELECT po.PositionID, 
        AVG(Amount) as AvgSalPerPosition
    FROM Positions po
    JOIN Players p ON po.PositionID = p.PositionID
    JOIN Salaries s ON p.PlayerID = s.PlayerID
    GROUP BY po.PositionID) s 
ON po.PositionID = s.PositionID
GROUP BY po.PositionID

但是,我怀疑您的版本性能会更好,因为聚合后的联接意味着最终联接会更小-只是两个派生表,它们的大小是不同位置的数量。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM