mysql - 非分组字段和具有聚合函数的字段可以同时存在吗?
问题描述
据我了解,如果某些字段的表达式包含聚合函数,则不接受同一查询中的普通字段 - 每个字段都应该是聚合的,或者包含在“分组依据”部分中。是这样吗?
如果我有一个带有一些聚合函数的查询文本,并且我有一个脚本(任何语言),它确定非聚合字段,如果它们不存在,它是否在逻辑上自动将它们包含到组部分中是正确的?还是存在一些不正确的情况?
谢谢
解决方案
这有点复杂。但是对您的问题的简单回答是,是的,您应该包括所有非聚合列/表达式。
接下来有两个警告。如果您有表达式,请确保包含表达式,而不是列。所以不要这样做:
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 是少数几个真正实现了这个功能的数据库之一。
推荐阅读
- ruby-on-rails - 使用 equals-to 和 twiddle-wakka 针对同一版本在 gem 依赖项之间运行 Bundle 更新时发生冲突
- python - 如果使用常量初始化器不需要指定形状?
- scala - 以编程方式安排作业防止重复作业
- java - 在类 'org.springframework.data.jpa.repository.support.JpaRepositoryFactoryBean' 中没有定义 1 个参数的构造函数
- extjs - ExtJS — 在 app/ 下组织文件
- zsh - 如何在 shell 中获取字符串路径?
- android - 获取 gradle 构建的 aapt2 参数?
- openstreetmap - 反向地理编码中的城市名称
- excel - Set Connection = Application.OpenConnection 使其他用户的 Excel 崩溃
- handlebars.js - 获取一个对象值,其键是车把中的数字?