首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MySQL5.6有ANY_VALUE功能吗?

MySQL5.6有ANY_VALUE功能吗?
EN

Stack Overflow用户
提问于 2016-05-07 21:47:25
回答 3查看 19.5K关注 0票数 17

目前我正在使用MySQL5.7进行开发,5.6处于生产阶段。每次在开发中使用GROUP BY运行查询时,我都会得到一些错误,如"Error Code: 1055. Expression #1 of SELECT list is not in group by“

下面是查询。

代码语言:javascript
复制
SELECT c.id, c.name, i.* 
 FROM countries c, images i 
WHERE i.country_id = c.id
GROUP BY c.id; Fixed for 5.7; 

SELECT c.id, c.name,
       ANY_VALUE(i.url) url, 
       ANY_VALUE(i.lat) lat, 
       ANY_VALUE(i.lng) lng 
  FROM countries c, images i
 WHERE i.country_id = c.id
 GROUP BY c.id;

为了解决这个问题,我使用了5.7 ANY_VALUE中的mysql函数,但主要问题是它在mysql5.6中不可用。

因此,如果我修复用于开发的sql语句,我将在生产中得到一个错误。

你知道MySQL5.6中的ANY_VALUE函数有什么解决方案或策略吗?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2016-05-07 22:26:28

你误用了notorious nonstandard MySQL extension to GROUP BY。标准SQL将始终拒绝您的查询,因为您提到的列不是聚合,在GROUP BY中也没有提到。在您的开发系统中,您正在尝试使用ANY_VALUE()解决这个问题。

在生产环境中,您可以关闭ONLY_FULL_GROUP_BY MySQL Mode. Try you this

代码语言:javascript
复制
  SET @mode := @@SESSION.sql_mode;
  SET SESSION sql_mode = '';
  /* your query here */
  SET SESSION sql_mode = @mode;

这将允许MySQL接受您的查询。

但是你看,你的查询并不是真的正确。当您能够说服它运行时,它会从images表中随机选择一行。这种不确定性通常会让用户和技术支持人员感到困惑。

为什么不改进查询,这样它就可以选择一个特定的图像。如果您的images表有一个自动递增的id列,您可以这样做来选择“第一个”图像。

代码语言:javascript
复制
SELECT c.id, c.name, i.*
  FROM countries c
  LEFT JOIN (
       SELECT MIN(id) id, country_id
         FROM images
        GROUP BY country_id
       ) first ON c.id = first.country_id
  LEFT JOIN images i ON first.id = i.id

这将为每个国家/地区返回一行,并显示可预测的图像。

票数 19
EN

Stack Overflow用户

发布于 2016-05-07 22:20:16

您可以使用MINMAX聚合函数来代替ANY_VALUE

或者,您可以考虑不设置ONLY_FULL_GROUP_BY SQL模式,该模式是在MySql 5.7中默认设置的,并且是您在MySql 5.6中体验到的差异的原因。然后,您可以延迟查询的更新,直到将所有环境迁移到MySql 5.7。

这两个中哪一个是更好的选择,这是有争议的,但从长远来看,更好的做法是调整您的查询,使它们符合ONLY_FULL_GROUP_BY规则。在此过程中,使用MINMAX当然是有用的。

票数 19
EN

Stack Overflow用户

发布于 2016-05-07 22:24:21

几十年来,您可以编写在标准SQL中无效但在mysql中完全有效的查询

在标准SQL中,包含GROUP BY子句的查询不能引用选择列表中未在GROUP BY子句中命名的非聚合列。例如,此查询在标准SQL中是非法的,因为选择列表中的非聚合名称列不会出现在GROUP BY中:

SELECT o.custid,c.name,MAX(o.payment) FROM orders o,customers AS c WHERE o.custid = c.custid GROUP BY o.custid;要使查询合法,必须从选择列表中省略name列或在GROUP BY子句中命名该列。

MySQL扩展了GROUP BY的标准SQL用法,以便选择列表可以引用GROUP BY子句中未指定的非聚集列。

这篇文章来自MySQL5.6手册中关于GROUP BY的页面。如果你看一下5.7.6的同一页,你会发现事情发生了变化。发生了戏剧性的变化!

该页面还为您提供了解决方案。禁用使您的旧5.6查询可以在5.7.6上工作的ONLY_FULL_GROUP_BY (从您的查询中删除ANY_VALUE,因为它在5.7.6中不可用,而改用ONLY_FULL_GROUP_BY )。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37089347

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档