Mysql重新使用子查询的总和

时间:2016-08-04 10:59:42

标签: mysql subquery field

我有以下简化查询:

Select
(select sum(f1) from tableA a where a.id = t.id) sum1,
(select sum(f2) from tableB b where b.id = t.id) sum2,
t.*
from Table t;

我的愿望是重新使用sum1和sum2而不再计算它们:

Select
(select sum(f1) from tableA a where a.id = t.id) sum1,
(select sum(f2) from tableB b where b.id = t.id) sum2,
sum1 + sum2 `sum3`,    
t.*
from Table t;

当然,我可以执行以下查询,但这不会使运行时间加倍:

Select
(select sum(f1) from tableA a where a.id = t.id) sum1,
(select sum(f2) from tableB b where b.id = t.id) sum2,
(select sum(f1) from tableA a where a.id = t.id) + 
(select sum(f2) from tableB b where b.id = t.id) `sum3`,    
t.*
from Table t;

甚至将sum1和sum2结果插入到一个临时表中,但无法成像,我可以忽略某些东西让mysql在求和字段上进行一些有效的查询。

是否有更好,更有效的方法来重复使用求和字段?

2 个答案:

答案 0 :(得分:1)

尝试运行此查询,

select Resutl.*,Result.sum1+Result.sum2 as sum3 from(
       SELECT (SELECT SUM(f1) FROM tableA a WHERE a.id = t.id) sum1,
              (SELECT SUM(f2) FROM tableB b WHERE b.id = t.id) sum2,
              t.*
       FROM Table t)Result
)

希望它会有所帮助。

答案 1 :(得分:0)

  

我的愿望是重新使用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

(但请注意,我已经对您的数据和架构进行了批次

>