为什么聚合函数不起作用,除非使用GROUP BY语句?

时间:2013-06-27 19:43:30

标签: mysql sql group-by aggregate-functions

要计算invoice的价格(在单独的表格中有 * invoice item * s并且链接到invoice s),我有写了这个查询:

SELECT `i`.`id`, SUM(ii.unit_price * ii.quantity) invoice_price
FROM (`invoice` i)

JOIN `invoiceitem` ii
ON `ii`.`invoice_id` = `i`.`id`

WHERE `i`.`user_id` = '$user_id'

但它只产生了一排。

经过研究,我得知在查询结束时我必须 GROUP BY i.id 。有了这个,结果就像预期的那样。

从我的观点来看,即使没有GROUP BY i.id,也没有任何遗失,它应该运作良好!

请用一些简单的句子告诉我......

为什么我应该经常使用额外的!!! GROUP BY i.id丢失的内容没有它,也许是最有效的问题,如何我应该记得我丢失了额外的GROUP BY? !

2 个答案:

答案 0 :(得分:4)

您必须包含该组,因为总和中有许多ID。如果你没有指定它,那么MySQL只选择第一个,并对整个结果集求和。 GroupBy告诉MySQL对每个Grouped By Entity进行求和(或通常聚合)。

答案 1 :(得分:3)

  

为什么我应该始终使用GROUP BY

SUM()和其他人Aggregate Functions。它们的本质要求它们与GROUP BY结合使用。

  

没有它会失去什么?

来自文档:

  

如果在不包含GROUP BY子句的语句中使用组函数,则它等同于对所有行进行分组。

最后,没有什么可以记住,因为它们是GROUP BY聚合函数。当结果包含整个结果集(错误地)时,您将很快从结果中看出您忘记了GROUP BY,而不是分组的子集。