通过阅读 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 中这两个查询之间的区别:
SELECT * FROM f_ean GROUP BY ean HAVING type = 'media'
--> 给我 57059 个结果
SELECT ean, type FROM f_ean GROUP BY ean HAVING type = 'media'
--> 给我 73201 个结果
只显示不同的列,查询的结果编号怎么可能不同?
您应该使用WHERE
,而不是HAVING
在您尝试过滤记录时使用。HAVING
用于在分组和排序发生后应用过滤器。
无论如何,问题在于 MySQL 如何使用GROUP BY
. GROUP BY
应与聚合一起使用;MySQL 为方便起见扩展了功能。由于它对列进行排序和分组的方式,您会收到不同的结果。
MySQL 扩展了 的使用,
GROUP BY
以便选择列表可以引用未在GROUP BY
子句中命名的非聚合列。这意味着前面的查询在 MySQL 中是合法的。您可以使用此功能通过避免不必要的列排序和分组来获得更好的性能。但是,这主要在每个未在 中命名的非聚合列中的所有值GROUP BY
对于每个组都相同时很有用。
MySQL 不保证非分组列中的哪个值将在结果集中,除非您指定使用 WHERE 子句或 AGGREGATE 函数(或可能是 JOIN 条件)。
稍微推测一下,从未见过任何文档来说明它如何选择要包含的值,我的假设是它在最相关的索引中使用行顺序。
因此,可以合理地假设 SELECTing colA、colZ 与 SELECTing * 可能会触发 MySQL 在编译结果集时利用不同的索引,改变行的“感知”顺序,并显示不同的值。
如果您使用 WHERE 条件,这无关紧要。在分组之前应用 WHERE 条件。但是,当您在未分组的列上使用 HAVING 条件时,该列中可能存在变化,您看到的差异在很大程度上是预期的行为。