【问题标题】:Same conditions, different result?相同的条件,不同的结果?
【发布时间】:2013-01-11 19:27:54
【问题描述】:
通过阅读 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 个结果
只显示不同的列,查询的结果编号怎么会不同?
【问题讨论】:
标签:
mysql
phpmyadmin
group-by
having-clause
【解决方案1】:
如果您要过滤记录,您应该使用WHERE,而不是HAVING。 HAVING 用于在分组和排序发生后应用过滤器。
无论如何,问题在于 MySQL 如何使用GROUP BY。 GROUP BY 应该与聚合一起使用; MySQL 为方便起见扩展了功能。由于它对列进行排序和分组的方式,您会收到不同的结果。
MySQL 扩展了GROUP BY 的使用,以便选择列表可以引用未在GROUP BY 子句中命名的非聚合列。这意味着前面的查询在 MySQL 中是合法的。您可以使用此功能通过避免不必要的列排序和分组来获得更好的性能。但是,这主要是在每个未在 GROUP BY 中命名的非聚合列中的所有值对于每个组都相同时有用。
见extensions to GROUP BY。
【解决方案2】:
除非您指定使用 WHERE 子句或 AGGREGATE 函数(或可能是 JOIN 条件),否则 MySQL 不承诺 哪个 来自非分组列的值将在结果集中。
推测了一下,从未见过任何文档来说明它如何选择要包含的值,我的假设是它在最相关的索引中使用行顺序。
因此,可以合理地假设 SELECTing colA、colZ 与 SELECTing * 可能会触发 MySQL 在编译结果集时利用不同的索引,改变行的“感知”顺序,并显示不同的值。
如果您使用 WHERE 条件,这无关紧要。在分组之前应用 WHERE 条件。但是,由于您在未分组的列上使用 HAVING 条件,并且该列中存在潜在变化,因此您看到的差异在很大程度上是预期行为。