我看到了,因为我不知道该组强制输入选择的所有字段的 MySQL 版本。(这是可配置的,但我无法更改它)。例如,如果我只想按用户 ID 进行分组,我不明白为什么必须将 select 的所有字段都放在 group by 中。
如果有人好心地解释(对于傻瓜,用苹果)这个原因,我会永远感激......我正在上网,我不明白他们给出的理由。他们说他们是很好的做法,但直到最近它可以毫无问题地完成,现在...... :(
我看到了,因为我不知道该组强制输入选择的所有字段的 MySQL 版本。(这是可配置的,但我无法更改它)。例如,如果我只想按用户 ID 进行分组,我不明白为什么必须将 select 的所有字段都放在 group by 中。
如果有人好心地解释(对于傻瓜,用苹果)这个原因,我会永远感激......我正在上网,我不明白他们给出的理由。他们说他们是很好的做法,但直到最近它可以毫无问题地完成,现在...... :(
这是因为 mysql 实际上从一开始就做错了。
子句
group by
,在所谓的 ANSI SQL(即标准 sql,对所有数据库都相同)中,必须是或是,具有其中定义的所有字段,select
并且未在分组函数中group by
使用知道它必须如何分组,按什么顺序。分组顺序由 给出group by
,而不是select
。不将某些字段放入
group by
, 的问题是:数据库如何知道它在其数据库中的所有数据中哪些必须放入该字段?让我们用一个例子来看看。
给定一张桌子
假设我们要按类别获取销售额。
这个查询在 mysql 中是完全有效的(附带说明,在 ACCESS 中也是如此),并给我们以下结果:
但是,您要在类别名称中输入什么?它放置了行中的所有数据中的哪一个?
没有人可以确定那里有什么数据......在这种情况下, categoryname 在所有行中都有相同的内容。但是,如果随着时间的推移,类别更改了名称,但代码没有更改,会发生什么?你会带哪一个?
让我们换一种方式来看……让我们“打破”上表:
让我们运行同样的
select
而现在……结果会如何?
还是下一个?
两个结果都是正确的。这就是为什么数据库不能假设你想在 categoryname 中放入什么,这就是为什么所有字段都必须在 中
group by
,或者是聚合函数的一部分。需要注意的是,聚合函数是分析字段并从中返回结果(总和、计数、平均值等)的函数。