我的愿望是重新使用sum1和sum2而不再计算它们
哇,稳稳地说。原始查询不如它有效。在不知道数据分布是什么样的情况下,很难建议最合适的查询是什么,但假设A和B中的元组在表T上具有外键约束(隐式或显式)但彼此没有隐式外键约束,t.id是唯一的,tableT中的大多数行在tableA和tableB中都有相应的行....
SELECT t.*, sum_f1, sum_f2
FROM tableT t
LEFT JOIN (SELECT a.id, SUM(f1) AS sum_f1
FROM tableA a
GROUP BY a.id) AS a_agg
ON t.id=a_agg.id
LEFT JOIN (SELECT b.id, SUM(f2) AS sum_f2
FROM tableB b
GROUP BY b.id) as b_agg
ON t.id=b_agg.id
GROUP BY t.id
会更有效率。
(这也假设ONLY_FULL_GROUP_BY被禁用 - 否则你需要在SELECT子句中替换&#t; *'并在group by子句中替换&t;。表中需要的每个属性)。
请注意,在实践中,您很少会在单个查询中查看所有您的数据。由于MySQL不能很好地处理推送谓词,只需在外部SELECT中添加过滤器可能不是最佳解决方案。
如上所述,您构建了自己的查询后,添加总结就变得微不足道了:
SELECT t.*, sum_f1, sum_f2,
IFNULL(sum_f1,0)+INFULL(sum_f2,0) AS sum3
FROM tableT t
LEFT JOIN (SELECT a.id, SUM(f1) AS sum_f1
FROM tableA a
GROUP BY a.id) AS a_agg
ON t.id=a_agg.id
LEFT JOIN (SELECT b.id, SUM(f2) AS sum_f2
FROM tableB b
GROUP BY b.id) as b_agg
ON t.id=b_agg.id
GROUP BY t.id
(但请注意,我已经对您的数据和架构进行了批次>