由于这三个聚合来自具有相同
WHERe条件的同一张表,因此您无需进行子选择。所有这三个聚合都在相同的行分组上进行操作(未
GROUPBY指定,因此整个表为一行),因此它们都可以
SELECt直接存在于列表中。
SELECT SUM(number) AS number_sum, MAX(number) AS number_max, MIN(number) AS number_minFROM `table`
如果任何聚合需要基于不同的条件
WHERe,那么您将在子句中进行过滤,那么您将需要为不同的条件使用子选择,或者进行笛卡尔联接。
LEFTJOIN对于仅返回一行的聚合,此子选择和以下方法应等效,在性能方面:
SELECt (SELECT SUM(number) FROM `table` WHERe `somecolumn` = `somevalue`) AS number_sum, MAX(number) AS number_max, MIN(number) AS number_minFROM `table`
或等同于上面的查询,您可以
LEFT JOIN针对
不带
ON子句_的子查询。仅当您知道子查询将仅返回一行时,才应执行此操作。否则,您将得到笛卡尔乘积-连接一侧返回的行数 _乘以 另一侧返回的行数。
这是方便,如果你需要用一组返回几列
WHERe条款及有几列一组不同的
WHERe条件,但只有 一个
从每个边行
JOIN。在这种情况下,与使用相同子句
JOIN进行 两个子 选择相比,它应该更快
WHERe。
这应该更快。
SELECt subq.number_sum_filtered, subq.number_max_filtered, MAX(`table`.number) AS number_max, MIN(`table`.number) AS number_minFROM `table` LEFT JOIN ( SELECt SUM(number) AS number_sum_filtered, MAX(number) AS number_max_filtered FROM `table` WHERe `somecolumn = `somevalue` ) subq
比这个…
SELECt (SELECT SUM(number) FROM `table` WHERe `somecolumn` = `somevalue`) AS number_sum_filtered, (SELECt MAX(number) FROM `table` WHERe `somecolumn` = `somevalue`) AS number_max_filtered, MAX(`table`.number) AS number_max, MIN(`table`.number) AS number_minFROM `table`



