【问题标题】:MySQL: Multiple joins and their effect on sumsMySQL:多重连接及其对总和的影响
【发布时间】:2016-10-17 01:27:15
【问题描述】:

我正在尝试加入多个表并使用 SUM 命令,但当我加入多个表时,我无法让 SUM 正常工作。从我在该主题上所做的阅读(此处和其他地方)来看,我相当确定解决方案是在我加入之前进行总结,但我正在努力完成这项工作。

如果我运行以下代码,只加入两个表,它可以完美运行:

SELECT CONCAT(m.nameFirst, " ",m.nameLast) AS Name, sum(b.g) AS G,sum(b.ab) AS AB, sum(b.h) AS H, sum(b.hr) AS HR, sum(b.sb) AS SB, sum(b.bb) AS BB, ROUND(sum(b.h)/sum(b.ab), 3) AS BA, ROUND((sum(b.h)+sum(b.bb)+sum(b.hbp))/(sum(b.ab)+sum(b.bb)+sum(b.hbp)+sum(b.sf)), 3) AS OBP, ROUND((sum(b.h)+sum(b.2b)+2*sum(b.3b)+3*sum(b.hr))/sum(b.ab), 3) as SLG
FROM Master m
JOIN Batting b on m.playerID = b.playerID
WHERE birthMonth = 6 and birthDay = 15
Group by b.playerID
ORDER by b.h DESC

如果我这样做,将第三个表添加到连接中,它会破坏总和:

SELECT CONCAT(m.nameFirst, " ",m.nameLast) AS Name, sum(b.g) AS G,sum(b.ab) AS AB, 
[exact same code as above removed for the sake of brevity]
sum(p.W) as WINS
FROM Master m
left JOIN Batting b on m.playerID = b.playerID
left join Pitching p on m.playerID = p.playerID
WHERE birthMonth = 6 and birthDay = 15
Group by m.playerID
ORDER by b.h DESC

正如我所说,我相当确定解决方案是在连接之前求和。我该怎么做呢?

提前致谢。

【问题讨论】:

  • 将原始查询放入子查询中,然后将其加入 Pitching。 SELECT blah FROM (original query) AS q LEFT JOIN pitching ... 您当然需要在子查询的结果中包含连接字段。

标签: mysql join sum


【解决方案1】:

一种技术是汇总表,然后在这些表上加入。

SELECT CONCAT(m.nameFirst, " ",m.nameLast) AS Name
    , b.G AS G, b.AB AS AB
    , p.W as WINS
FROM Master m
LEFT JOIN 
  (SELECT playerID, SUM(g) AS G, SUM(ab) AS AB
   FROM Batting
   GROUP BY playerID) AS b
    ON m.playerID = b.playerID
LEFT JOIN 
   (SELECT playerID, sum(W) AS WINS
    FROM Pitching
    GROUP BY playerID) AS p 
  ON m.playerID = p.playerID
WHERE birthMonth = 6 and birthDay = 15

您总是可以将子查询移动到 SELECT 结构中

SELECT CONCAT(m.nameFirst, " ",m.nameLast) AS Name
    , (SELECT SUM(g)
       FROM Batting AS b
       WHERE m.playerID = b.playerID) AS G
    , (SELECT SUM(ab)
       FROM Batting
       WHERE m.playerID = b.playerID) AS AB
    , (SELECT sum(W)
       FROM Pitching AS p
       WHERE m.playerID = p.playerID) AS WINS
FROM Master m
WHERE birthMonth = 6 and birthDay = 15

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多