首页 > 解决方案 > 非分组字段和具有聚合函数的字段可以同时存在吗?

问题描述

据我了解,如果某些字段的表达式包含聚合函数,则不接受同一查询中的普通字段 - 每个字段都应该是聚合的,或者包含在“分组依据”部分中。是这样吗?

如果我有一个带有一些聚合函数的查询文本,并且我有一个脚本(任何语言),它确定非聚合字段,如果它们不存在,它是否在逻辑上自动将它们包含到组部分中是正确的?还是存在一些不正确的情况?

谢谢

标签: mysqlsql

解决方案


这有点复杂。但是对您的问题的简单回答是,是的,您应该包括所有非聚合列/表达式。

接下来有两个警告。如果您有表达式,请确保包含表达式,而不是列。所以不要这样做:

select date(datetimecol), count(*)
from t
group by datetimecol;

正确的逻辑是:

select date(datetimecol), count(*)
from t
group by date(datetimecol);

第二个警告涉及主键。如果a_id是 中的主键a,那么这很好:

select a.*, count(*)
from a join
     b
     on <whatever>
group by a.a_id;

但是,包括 中的所有列group by也是正确的。

注意:这称为函数依赖,标准 SQL 支持。然而,MySQL 是少数几个真正实现了这个功能的数据库之一。


推荐阅读