为了账号安全,请及时绑定邮箱和手机立即绑定

MySQL 5.6是否具有ANY_VALUE功能?

MySQL 5.6是否具有ANY_VALUE功能?

阿晨1998 2020-02-01 17:04:00
目前,我正在开发中使用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.idGROUP 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函数的任何解决方案或策略填充吗?
查看完整描述

3 回答

?
噜噜哒

TA贡献1784条经验 获得超7个赞

ANY_VALUE可以使用MIN或MAX汇总函数代替。


另外,您可能会考虑不设置ONLY_FULL_GROUP_BYSQL模式,这是MySql 5.7的默认设置,它负责您与MySql 5.6的区别。然后,您可以延迟查询的更新,直到将所有环境迁移到MySql 5.7。


两者中的哪一个是更好的选择,值得商de,但从长远来看,适应您的查询会更好,这样他们才能遵守ONLY_FULL_GROUP_BY规则。使用MIN或MAX肯定可以这样做。


查看完整回答
1 反对 回复 2020-02-01
?
Smart猫小萌

TA贡献1911条经验 获得超7个赞

几十年来,您可以编写在标准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)。


查看完整回答
1 反对 回复 2020-02-01
  • 3 回答
  • 0 关注
  • 3193 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信