是否有MySQL 5.6的ANY_VALUEfunction?
目前我在开发中使用mysql 5.7,在生产中使用5.6。 每次我在开发中运行一个组的查询,我得到一些错误,如“错误代码:1055。SELECT列表的expression式#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函数的任何解决scheme或polifill?
你滥用臭名昭着的非标准的MySQL扩展到GROUP BY 。 标准SQL将始终拒绝您的查询,因为您提到的是不是聚合的列,在GROUP BY
中没有提及。 在你的开发系统中,你试图用ANY_VALUE()
来解决这个问题。
在生产中,您可以closuresONLY_FULL_GROUP_BY MySQL模式。 尝试这样做:
SET @mode := @@SESSION.sql_mode; SET SESSION sql_mode = ''; /* your query here */ SET SESSION sql_mode = @mode;
这将允许MySQL接受你的查询。
但是看,你的查询是不正确的。 当您可以说服它运行时,它会从images
表中返回一个随机select的行。 这种不确定性经常会导致用户和技术支持人员的困惑。
为什么不使查询更好,所以它select一个特定的图像。 如果你的images
表有一个自动增量id
列,你可以这样做来select“第一个”图像。
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
每个国家将返回一行,并显示可预测的图像。
您可以使用MIN
或MAX
聚合函数代替ANY_VALUE
。
或者,可以考虑不设置默认情况下为MySql 5.7设置的ONLY_FULL_GROUP_BY
SQL模式,并负责与MySql 5.6的差异。 然后,您可以延迟更新查询,直到您将所有环境迁移到MySql 5.7。
哪一个更好呢,是有争议的,但从长远来看,适应你的查询会更好,所以他们坚持ONLY_FULL_GROUP_BY
规则。 使用MIN
或MAX
当然可以用来做这件事。
几十年来,您可以编写在标准SQL中无效的查询,但完全有效的mysql
在标准SQL中,包含GROUP BY子句的查询不能引用未在GROUP BY子句中命名的select列表中的非聚合列。 例如,这个查询在标准SQL中是非法的,因为select列表中的nonaggregated name列没有出现在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; 为使查询合法,名称列必须从select列表中省略或在GROUP BY子句中命名。
MySQL扩展了GROUP BY的标准SQL使用,以便select列表可以引用未在GROUP BY子句中指定的非聚合列。
这来自GROUP BY的Mysql 5.6手册页面。 如果你看看5.7.6的相同页面,你会发现事情已经改变了。 并戏剧性的改变!
该页面也为您提供解决scheme。 禁用ONLY_FULL_GROUP_BY
这将使旧5.6查询可以在5.7.6上工作(从查询中删除ANY_VALUE,因为它在5.7.6中不可用,但是使用ONLY_FULL_GROUP_BY)。