【问题标题】:MySQL divide by values from 2 subqueriesMySQL除以来自2个子查询的值
【发布时间】:2017-10-25 21:55:48
【问题描述】:

表结构如下:

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

【问题讨论】:

  • 看起来我会怎么写。
  • 可能不会有什么不同,但COUNT(GoalID) 可以是COUNT(*)。见stackoverflow.com/questions/2876909/…
  • 我觉得很好。
  • @Barmar - 这应该是相同的运行计划。究竟我将如何处理它b.digg,看起来不错......我想我们可以指出得分目标中的1行= 1个目标是一个假设,但如果这个假设是有效的,那么你很好。竖起大拇指的表情符号在哪里?
  • 您的查询真的有性能问题吗?假设您在要加入的所有列上都有索引,我认为它应该表现良好。

标签: mysql sql join group-by


【解决方案1】:

通过将第二个子查询与第​​一个子查询中的表连接起来,可以只使用一个子查询而不是 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

但是,我怀疑您的版本会表现得更好,因为在聚合之后加入意味着最终的连接会更小——它只是两个派生表,其大小是不同位置的数量。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-05-15
    • 2022-01-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多