8

我有一个 MySQL 表,其中包含字段idstring. ids 是独一无二的。 strings 是 varchars 并且是非唯一的。

我执行以下查询:

SELECT id, string, COUNT( * ) AS frequency
FROM table
GROUP BY string
ORDER BY frequency DESC, id ASC

问题

假设该表包含三个具有相同string值的行,ids 为 1、2 和 3。

  1. 哪个id将被返回(1、2 或 3)?
  2. id这个查询将去往哪个ORDER BY(与返回的相同?...见问题 1)?
  3. 你能控制哪些id被退回/用于订购吗?例如。返回最大的id,或者id是 GROUP 中的第一个。

我最终想要做的是获得相同字符串的频率出现,按该频率排序,从最高到最低,并在频率关系上,从返回/排序的组id中最小的排序。id我使情况更加通用,以弄清楚 MySQL 如何处理这种情况。

4

2 回答 2

8

哪个 id 将被返回(1、2 或 3)?

A:服务器将为所有具有相同名称的记录选择它想要的id(很可能是最快的获取,这是不可预测的)。引用官方文档:

服务器可以从每个组中自由选择任何值,因此除非它们相同,否则选择的值是不确定的。

此链接中的更多信息。

此查询将使用哪个 ID ORDER BY(与返回的相同?...见问题 1)?

找出检索到的数据将以什么顺序返回是没有意义的,因为您无法预测您将获得的结果。但是,您很可能会得到按不可预测的 ID 列排序的结果。

您可以控制返回/用于订购的 id 吗?例如。返回最大的 id,或 GROUP 中的第一个 id。

你应该在这一点上假设你不能。再次阅读文档。

让事情变得更清楚:您无法预测不正确使用的 GROUP BY 子句的结果。MySQL 的主要问题是它允许您以非标准方式使用它,但您需要知道如何使用该功能。它背后的要点是按您知道将始终相同的字段进行分组。例如:

SELECT id, name, COUNT( * ) AS frequency
FROM table
GROUP BY id

在这里,你知道name将是独一无二的,因为它在id功能上决定了name。所以你知道的结果是有效的。如果您还按名称分组,则此查询会更标准,但在 MySQL 中的性能会稍差。

作为最后一点,请考虑到,根据我的经验,对选定字段和非分组字段的非标准查询的结果通常是您将在该字段上应用 aGROUP BY然后再应用 a 的ORDER BY结果。这就是为什么很多时候它似乎有效。但是,如果您继续测试,您最终会发现这种情况在 95% 的情况下都会发生。你不能依赖那个数字。

于 2013-09-10T03:16:21.963 回答
4

文档说,当不按所有非聚合列分组时,如果返回按列分组,则每个唯一组合对应一行。选择的行取决于服务器 - 即“随机”

然而,实际上它是处理过程中遇到的第一行。您可以通过从按返回优先顺序排序的内部查询中进行选择来控制首先遇到哪个。

例如,获取每个名称的最低 id(是的,无证,等等,但它有效!):

SELECT id, name, COUNT( * ) AS frequency
FROM (select * from table order by id) x
GROUP BY name
ORDER BY frequency DESC, id ASC

我个人对依赖这种行为感到很自在,并且从未见过或听说过它在现实生活中的表现有所不同。许多人将其视为无证和“风险”,但如果它有效,它就有效。

于 2013-09-10T03:07:21.900 回答