2013-01-11 101 views
3

从阅读MySQL的文档,我无法解释这两个查询之间的区别在phpMyAdmin:同样的条件,不同的结果?

SELECT * FROM f_ean GROUP BY ean HAVING type = 'media' 

- >给我57059个结果

SELECT ean, type FROM f_ean GROUP BY ean HAVING type = 'media' 

- >给我73201个结果

如何通过只显示不同的列来查询的结果号不同?

回答

2

如果您要过滤记录,则应该使用WHERE而不是HAVINGHAVING用于在分组和排序发生后应用过滤器。

无论如何,问题在于MySQL如何使用GROUP BYGROUP BY应与聚合使用;为了方便,MySQL扩展了功能。由于它对列进行排序和分组的方式,您会收到不同的结果。

MySQL扩展了GROUP BY的使用,以便选择列表可以引用未在GROUP BY子句中指定的非聚集列。这意味着前面的查询在MySQL中是合法的。您可以使用此功能通过避免不必要的列排序和分组来获得更好的性能。但是,这对于每个组中未在GROUP BY中命名的每个非聚集列中的所有值都是相同的情况都很有用。

参见extensions to GROUP BY

2

MySQL不答应从非分组的列值将在结果集中,除非你指定使用WHERE子句或集合函数(或可能JOIN条件)。

投机一点,从来没有见过任何文件表明它如何选择哪个值包含,我的假设是它使用最相关索引内的行顺序。

因此,假设选择colA,colZ与SELECTing *可能会触发MySQL在编译结果集时改变不同索引,改变行的“感知”顺序并呈现不同的值。

如果您使用的是WHERE条件,这无关紧要。在分组之前应用条件。但是,当您在该列中存在潜在变化的非分组列上使用HAVING条件时,您所看到的差异很大程度上是预期行为