MySQL 5.6是否具有ANY_VALUE功能?

目前,我正在开发中使用mysql 5.7,在生产中使用5.6。每次我在开发中使用group by运行查询时,都会收到类似“错误代码:1055。SELECT列表的表达式#1不在GROUP BY中”的错误。


这是查询。


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函数,但是主要问题是它在mysql 5.6中不可用


因此,如果我修复开发的sql语句,我将在生产中出现错误。


您知道mysql 5.6中ANY_VALUE函数的任何解决方案或策略填充吗?


阿晨1998
浏览 3202回答 3
3回答

噜噜哒

ANY_VALUE可以使用MIN或MAX汇总函数代替。另外,您可能会考虑不设置ONLY_FULL_GROUP_BYSQL模式,这是MySql 5.7的默认设置,它负责您与MySql 5.6的区别。然后,您可以延迟查询的更新,直到将所有环境迁移到MySql 5.7。两者中的哪一个是更好的选择,值得商de,但从长远来看,适应您的查询会更好,这样他们才能遵守ONLY_FULL_GROUP_BY规则。使用MIN或MAX肯定可以这样做。

Smart猫小萌

几十年来,您可以编写在标准SQL中无效但在MySQL中完全有效的查询在标准SQL中,包含GROUP BY子句的查询不能引用选择列表中未在GROUP BY子句中命名的未聚合列。例如,此查询在标准SQL中是非法的,因为选择列表中的未聚合名称列未出现在GROUP BY中:从订单AS o,客户AS中选择o.custid,c.name,MAX(o.payment)MAX。o.custid = c.custid GROUP BY o.custid; 为了使查询合法,必须从选择列表中省略name列或在GROUP BY子句中命名。MySQL扩展了SQL对GROUP BY的标准用法,以便选择列表可以引用未在GROUP BY子句中命名的非聚合列。这来自GROUP BY上的Mysql 5.6手册页。如果在5.7.6的同一页面上查看,您会发现情况已经改变。并发生了巨大变化!该页面还为您提供了解决方案。禁用ONLY_FULL_GROUP_BY这将使您旧的5.6查询可以在5.7.6上运行(从查询中删除ANY_VALUE,因为它在5.7.6中不可用,而是使用ONLY_FULL_GROUP_BY)。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

MySQL