考虑到下面的简单语句,我在客户表中使用了SUM和COUNT值,但我也想使用这些值来计算第三列average_sale。
我立即尝试只使用看起来更清晰的列别名,但是我不得不再次使用SUM和COUNT。
这是表演者吗?
SELECT
SUM(payments.amount) as total_sales,
COUNT(payments.id) as quantity,
SUM(payments.amount) / COUNT(payments.id) as average_sale,
`users`.`name`,
`payments`.`user_id`
FROM `payments`
INNER JOIN `users` on `payments`.`user_id` = `users`.`id`
GROUP BY `payments`.`user_id`
ORDER BY `total_sales` DESC
答案 0 :(得分:0)
作为一般性回答,我会说不。但是,只有SQL执行计划可以说明。
在您的情况下,您将多次重复使用相同的聚合表达式。甚至一个基本的SQL优化器也应该意识到它们是相同的,并且每次都会计算一次。
由于您的查询没有过滤条件,因此它将整体读取两个表。您查询的最大成本可能与加入顺序有关。它应该以{{1}}开始,然后步行到payments
,反之亦然吗?索引的存在/不存在可能是决定性的。
编辑:
现在,如果您发现优化器不是那么聪明,则可以通过使用子查询(或使用MySQL 8.x的CTE)来确保它仅计算一次聚合。例如,您可以将查询改写为:
users