【问题标题】:Which record will GROUP BY choose in SQL [duplicate]在 SQL 中 GROUP BY 将选择哪条记录 [重复]
【发布时间】:2023-03-28 07:56:01
【问题描述】:

如果我有这样的 SQL 查询:

SELECT playerno,town
FROM players
GROUP BY town

在这种情况下,服务器将返回一个城镇,而对于 playerno,它将返回一个值,即使数据库中有多个值。

我的问题是,将选择哪个值?选择是随机做出的,还是会采取第一个结果,还是会发生其他事情? 谢谢。

【问题讨论】:

  • 所以你使用的是MySql?由于您提到的原因(已选择),在 SQL-Server 中甚至不允许这样做。来自documentation:“选择的值是不确定的”。
  • 它是哪个数据库? SQL Server、MySQL ??
  • 是的,通过 PHPMyAdmin(它是 MySQL)

标签: mysql sql group-by choice


【解决方案1】:

MySQL 文档对"Group By Extentions" 部分中发生的情况非常明确。

例如,这个查询在标准 SQL 中是非法的,因为名称 选择列表中的列未出现在 GROUP BY 中:

  SELECT o.custid, c.name, MAX(o.payment)
  FROM orders AS o, customers AS c
  WHERE o.custid = c.custid
  GROUP BY o.custid;

为了使查询合法,必须从 在 GROUP BY 子句中选择列表或命名。

MySQL 扩展了 GROUP BY 的使用,以便选择列表可以引用非聚合列而不是 在 GROUP BY 子句中命名。这意味着前面的查询是 在 MySQL 中是合法的。您可以使用此功能通过以下方式获得更好的性能 避免不必要的列排序和分组。然而,这是 主要在每个非聚合列中的所有值都不是 在 GROUP BY 中命名的每个组都相同。服务器是免费的 从每个组中选择任何值,因此除非它们相同,否则 选择的值是不确定的。此外,值的选择 添加 ORDER BY 子句不会影响来自每个组的。 结果集的排序发生在选择值之后,并且 ORDER BY 不会影响服务器在每个组中的哪些值 选择。

因此,您的问题的答案是不确定。这些值来自不确定的行,您不应依赖于来自任何特定行的值。

【讨论】:

    【解决方案2】:

    如果您不告诉引擎该做什么,它会自行决定。它取决于引擎,有些会采用第一个,有些会采用最后一个,有些会出错。您可以使用以下功能之一来控制它:

    1. 第一个(字段名)
    2. 上一个(字段名)
    3. 分钟(字段名)
    4. max(字段名

    甚至取平均或总和:通过使用 su

    【讨论】:

    • 如何在查询中使用这些函数?这是正确的:'GROUP BY FIRST(fieldname)'?还是谢谢。
    • 首先选择(playerno),town FROM player GROUP BY town
    • 我不熟悉这个线程的年表,但是FIRST不是mysql函数
    • 令人惊讶的是,这个答案被接受了,因为 first() 和 last() 没有记录 MySQL 函数。我也不相信任何存储引擎都能保证“裸”列的结果。
    猜你喜欢
    • 2023-03-17
    • 2020-03-17
    • 2019-06-29
    • 1970-01-01
    • 1970-01-01
    • 2018-09-18
    • 1970-01-01
    • 1970-01-01
    • 2022-08-11
    相关资源
    最近更新 更多