[英]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.