我有以下简化查询:
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在求和字段上进行一些有效的查询。
是否有更好,更有效的方法来重复使用求和字段?
答案 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
(但请注意,我已经对您的数据和架构进行了批次
>