使用MySQL进行分组时返回哪一行的字段?

时间:2013-09-10 02:59:08

标签: mysql group-by sql-order-by

我有一个包含字段idstring的MySQL表格。 id是独一无二的。 string是varchars并且是非唯一的。

我执行以下查询:

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

问题

假设该表包含三行,其string值相同,id为1,2和3。

  1. 哪个id将被退回(1,2或3)?
  2. 此查询前往id ORDER BY(与返回的内容相同?...请参阅问题1)?
  3. 你能控制哪个id被退回/用于订购吗?例如。从群组中返回最大的id或第一个id
  4. 我最终要做的是获得相同字符串的频率出现,按频率排序,从最高到最低,以及频率平衡,按id排序id {}来自返回/订购的组。我使情况更加通用,以弄清楚MySQL如何处理这种情况。

2 个答案:

答案 0 :(得分:6)

将返回哪个ID(1,2或3)?

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

  

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

link中的更多信息。

此查询转到ORDER BY的哪个ID(与返回的相同?...请参阅问题1)?

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

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

你应该假设你不能这样做。再读一遍文档。

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

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

在此,您知道name将是唯一的,id在功能上决定name。所以你知道的结果是有效的。如果您按名称进行分组,则此查询将更加标准,但在MySQL中执行情况​​稍差。

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

答案 1 :(得分:3)

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

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

例如,获取每个名称的最低ID(是的,没有记录,等等等,但是它有效!):

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

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