优化包含多个子查询的查询

时间:2017-07-20 06:28:54

标签: mysql sql

我很难在脑子里工作,需要一些帮助来确定是否有更好的方法来产生相同的结果。

我们有3个表:商店,部门,销售。 每个商店都可以有很多部门。 每个部门都可以有很多销售。

我有一个查询列出每个商店和计数&总结销售相关性。但是当我觉得它应该可以在1中完成时,操作是用2个子查询进行的。

这只是一个运行得很快的样本。在我正在建立的现实世界报告中,我发现我添加的每个后续子查询都会显着降低报告的整体性能。

SQL Fiddle

SELECT `name`,

@totalvalue := ( SELECT SUM(`price`) FROM `sales` WHERE `sales`.`department` IN (
  SELECT `id` FROM `departments` WHERE `departments`.`store`=`stores`.`id`
) ) AS `totalvalue`,

@totalsales := ( SELECT COUNT(*) FROM `sales` WHERE `sales`.`department` IN (
  SELECT `id` FROM `departments` WHERE `departments`.`store`=`stores`.`id`
) ) AS `totalsales`,

ROUND(@totalvalue / @totalsales,2) AS `averagesale`

FROM `stores`;

如何在1子查询中或通过连接生成totalsalestotalvalue

非常感谢您提供的任何帮助。

1 个答案:

答案 0 :(得分:3)

您必须一起使用GROUP BY聚合函数和JOIN表:

SELECT st.name, SUM(s.price) totalvalue, COUNT(s.id) totalsales, ROUND(AVG(s.price),2) averagesale
FROM stores st
LEFT JOIN departments d ON d.store=st.id
LEFT JOIN sales s ON s.department=d.id
GROUP BY st.name

LEFT JOIN,因为你想要显示所有商店,无论是否有任何数据,否则你会使用INNER JOIN。

此外,您不必自己计算平均值 - 内置函数。只要您不需要加权平均值就足够了。