当前位置: 首页 > 面试题库 >

MySQL-选择不在分组依据中的列

郦磊
2023-03-14
问题内容

我正在尝试向先前存在的应用程序中添加功能,并且遇到了如下MySQL视图:

SELECT
     AVG(table_name.col1),
     AVG(table_name.col2),
     AVG(table_name.col3),
     table_name.personID,
     table_name.col4
FROM table_name
GROUP BY table_name.personID;

好,所以有一些聚合函数。您可以选择personID,因为您正在对其进行分组。但是它还会选择不在聚合函数中并且不属于GROUP
BY子句的列。这怎么可能???它是否只是选择一个随机值,因为每个组中的值肯定不是唯一的?

我来自(MSSQL Server),那是一个错误。有人可以向我解释此行为以及为什么它在MySQL中被允许吗?


问题答案:

的确,此功能允许一些模棱两可的查询,并且以静默方式返回结果集,并从该列中选择一个任意值。实际上,它往往是该组中的行中的值首先被物理存储。

如果您仅选择功能上依赖于GROUP
BY条件中的列的列,则这些查询并不是明确的。换句话说,如果每个用于定义该组的值的“歧义”列中只有一个不同的值,则没有问题。此查询在Microsoft SQL
Server(和ANSI SQL)中将是非法的,即使它不能在逻辑上导致歧义:

SELECT AVG(table1.col1), table1.personID, persons.col4
FROM table1 JOIN persons ON (table1.personID = persons.id)
GROUP BY table1.personID;

另外,MySQL具有SQL模式以使其符合标准:
ONLY_FULL_GROUP_BY

FWIW,SQLite也允许这些模棱两可的GROUP BY子句,但是它从组的 最后 一行选择值。†

†至少在我测试的版本中。表示 任意性的意思
是,MySQL或SQLite将来都可能更改其实现,并具有一些不同的行为。因此,在这样的模棱两可的情况下,您不应该依赖行为保持当前状态。最好将查询重写为确定性的,而不是模棱两可的。这就是为什么MySQL
5.7现在默认情况下启用ONLY_FULL_GROUP_BY的原因。



 类似资料:
  • 问题内容: 我有一个看起来像这样的mysql表: 我需要一个查询来选择具有不同的第2列和第3列的所有行,例如,我希望此示例的输出如下所示: 我已经找到了一些有关如何执行此操作的示例,但它们在每一列上的选择都是不同的。 问题答案: 假设第一列是唯一的,则可以执行以下操作: 看到它在线运行:sqlfiddle

  • 问题内容: 我希望能够从电子邮件表中选择一堆行并按发件人分组。我的查询如下所示: 该查询几乎可以按我希望的方式工作-它选择按电子邮件分组的记录。问题在于主题和时间戳记与特定电子邮件地址的最新记录不符。 例如,它可能返回: 当数据库中的记录是: 如果“编程问题”主题是最新的,那么在对电子邮件进行分组时如何使MySQL选择该记录? 问题答案: 一个简单的解决方案是将查询包裹与ORDER语句子选择 第一

  • 此实例中的任务是获取数据库中每个作者的最新文章。 示例查询产生不可用的结果,因为它并不总是返回的最新消息。 目前公认的答案是 编辑:这个问题是另一个问题的延续,我的具体情况略有不同。您可以(也应该)假设还有一个wp_posts.id是该特定帖子的唯一标识符。

  • 我正在使用SQLServer2008,我想知道我是否可以在一个select语句中完成查询,而不需要子查询。 如果记录中的某个字段在最近10个创建的记录中为true,我想将变量设置为true,如果该字段在最近10个记录中为true,则变量为true,如果为false,则变量为false,如果记录总数小于10,则变量也为false。 我的问题是,要获取最新创建的10条记录,我需要通过降序对用户进行排序

  • 问题内容: 我想查找一位讲师在特定年份教过多少个模块,并想要选择该讲师的姓名和该讲师的模块数。 问题在于,因为我正在选择,并且必须按名称对其进行分组才能使其正常工作。但是,如果有两个讲师姓名相同,该怎么办?然后,sql将使它们合而为一,这将是错误的输出。 因此,我真正想做的是选择,但选择group by ,而sql不允许我这样做。有办法解决吗? 下表是: 到目前为止,这是我的查询: 问题答案:

  • 问题内容: 我有这样的桌子 我想写一个选择查询,这样我就可以得到这样的结果 在这里,我需要按ID和数量总和进行分组,并用相同的ID和Differentnet名称连接字符串名称 问题答案: 这将与sql-server 2008一起使用