从阅读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结果
如何仅通过显示不同的列来查询查询的结果编号?
答案 0 :(得分:2)
如果您尝试过滤记录,则应该使用WHERE
,而不是HAVING
。 HAVING
用于在分组和排序发生后应用过滤器。
无论如何,问题在于MySQL如何使用GROUP BY
。 GROUP BY
应与汇总一起使用; MySQL为了方便而扩展了功能。由于对列进行排序和分组的方式,您会收到不同的结果。
MySQL扩展了
GROUP BY
的使用,以便选择列表可以引用未在GROUP BY
子句中命名的非聚合列。这意味着前面的查询在MySQL中是合法的。您可以通过避免不必要的列排序和分组来使用此功能来获得更好的性能。但是,当GROUP BY
中未在{{1}}中命名的每个非聚合列中的所有值对于每个组都相同时,这非常有用。
答案 1 :(得分:2)
MySQL不承诺来自非分组列的值将在结果集中,除非您使用WHERE子句或AGGREGATE函数(或可能是JOIN条件)指定。
推测一点,从未见过任何文档来指示它如何选择要包含的值,我的假设是它在最相关的索引中使用行顺序。
因此,可以合理地假设SELECTing colA,colZ与SELECTing *可能会在编译结果集时触发MySQL利用不同的索引,改变行的“感知”顺序,并显示不同的值。
如果您使用的是WHERE条件,这无关紧要。在分组之前应用条件。但是,当您在非分组列中使用HAVING条件且该列中存在潜在变化时,您所看到的差异在很大程度上是预期行为。