目前我正在使用MySQL5.7进行开发,5.6处于生产阶段。每次在开发中使用GROUP BY运行查询时,我都会得到一些错误,如"Error Code: 1055. Expression #1 of SELECT list is not in 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函数,但主要问题是它在mysql5.6中不可用。
因此,如果我修复用于开发的sql语句,我将在生产中得到一个错误。
你知道MySQL5.6中的ANY_VALUE函数有什么解决方案或策略吗?
发布于 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
SET @mode := @@SESSION.sql_mode;
SET SESSION sql_mode = '';
/* your query here */
SET SESSION sql_mode = @mode;这将允许MySQL接受您的查询。
但是你看,你的查询并不是真的正确。当您能够说服它运行时,它会从images表中随机选择一行。这种不确定性通常会让用户和技术支持人员感到困惑。
为什么不改进查询,这样它就可以选择一个特定的图像。如果您的images表有一个自动递增的id列,您可以这样做来选择“第一个”图像。
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这将为每个国家/地区返回一行,并显示可预测的图像。
发布于 2016-05-07 22:20:16
您可以使用MIN或MAX聚合函数来代替ANY_VALUE。
或者,您可以考虑不设置ONLY_FULL_GROUP_BY SQL模式,该模式是在MySql 5.7中默认设置的,并且是您在MySql 5.6中体验到的差异的原因。然后,您可以延迟查询的更新,直到将所有环境迁移到MySql 5.7。
这两个中哪一个是更好的选择,这是有争议的,但从长远来看,更好的做法是调整您的查询,使它们符合ONLY_FULL_GROUP_BY规则。在此过程中,使用MIN或MAX当然是有用的。
发布于 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 )。
https://stackoverflow.com/questions/37089347
复制相似问题