MySQL – select不在分组的列

我试图添加function到一个预先存在的应用程序,我碰到一个MySQL的看法是这样的:

SELECT AVG(table_name.col1), AVG(table_name.col2), AVG(table_name.col3), table_name.personID, table_name.col4 FROM table_name GROUP BY table_name.personID; 

好,所以有几个聚合函数。 你可以selectpersonID,因为你正在分组。 但它也是select一个不在聚合函数中的列,而不是GROUP BY子句的一部分。 这怎么可能??? 它只是select一个随机值,因为这些值绝对不是每组独一无二的?

我从哪里来(MSSQL服务器),这是一个错误。 有人可以向我解释这种行为,为什么它允许在MySQL?

确实,这个特性允许一些不明确的查询,并且默认返回一个结果集,并且从该列中选取一个任意的值。 在实践中,它往往是从物理上先存储在组中的行中的值。

如果您只select在function上依赖于GROUP BY条件中的列的列,则这些查询不是不明确的。 换句话说,如果每个定义组的值的“不明确”列只能有一个不同的值,那就没有问题了。 这个查询在Microsoft SQL Server(和ANSI SQL)中是非法的,尽pipe它在逻辑上不能造成歧义:

 SELECT AVG(table1.col1), table1.personID, persons.col4 FROM table1 JOIN persons ON (table1.personID = persons.id) GROUP BY table1.personID; 

此外,MySQL有一个SQL模式,使其符合标准: ONLY_FULL_GROUP_BY

FWIW,SQLite也允许这些不明确的GROUP BY子句,但它从组中的最后一行中select值。

我应该早一点Googlesearch…似乎我find了我的答案 。

MySQL扩展了GROUP BY的使用,以便您可以在SELECT列表中使用未出现在GROUP BY子句中的非聚合列或计算。 通过避免不必要的列sorting和分组,您可以使用此function获得更好的性能。 例如,您不需要在以下查询中对customer.name进行分组

在标准SQL中,您必须将customer.name添加到GROUP BY子句中。 在MySQL中,名称是多余的。

不过,这似乎…错了。

 select * from personel where p_id IN(select min(dbo.personel.p_id) FROM personel GROUP BY dbo.personel.p_adi)