首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >10月份CMS - SQL请求与sql_mode=only_full_group_by不兼容

问10月份CMS - SQL请求与sql_mode=only_full_group_by不兼容
EN

Stack Overflow用户
提问于 2016-12-16 10:52:57
回答 1查看 984关注 0票数 3

在我的本地环境中有一个奇怪的问题: wamp64 MySQL5.7.14 OctoberCMS 382

这在几个插件中遇到,例如,这个插件试图在后端显示幻灯片列表。

语法错误或访问冲突: ORDER子句的1055表达式#1不是按子句分组,而是包含非聚合列'dbname.flosch_slideshow_slides.sort_order‘,该列在功能上不依赖于按子句分组的列; 这与sql_mode=only_full_group_by不兼容。 (SQL: 选择flosch_slideshow_slides.slideshow_id,计数(*)作为计数 来自flosch_slideshow_slides 其中flosch_slideshow_slides.slideshow_id在(2,1)中 flosch_slideshow_slides.slideshow_id组 由sort_order asc订购 )

另一个例子则略有不同。这个试图在前端显示产品列表的

语法错误或访问冲突: SELECT list的1055表达式#51没有按子句分组,而是包含非聚合列'dbname.jiri_jkshop_products_categories.category_id‘,它在功能上不依赖于按子句分组的列; 这与sql_mode=only_full_group_by不兼容。 (SQL: 从jiri_jkshop_products内部连接jiri_jkshop_products_categories on id = jiri_jkshop_products_categories.product_id中选择*,其中active =1和category_id在(8)中,visibility =1按title的id顺序分组 )

这些请求在此触发:

Backend\Behaviors\ListController->listRender()

所以我没办法

我指定它在远程服务器和我的伙伴的本地环境中工作得很好。

另一个有趣的问题是,由于我应用了系统的最新更新(从365版到382版)和所有已安装的插件。然后,为了进行测试,我在远程服务器上做了同样的工作,而且它仍然可以工作。

因为我主要是在本地工作,这很烦人。

你有什么办法来解决它吗?理想情况下,不修改mysql/sql_mode

谢谢和问候,帕特里克

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-12-16 12:57:24

很长一段时间以来,MySQL包含了一个臭名昭著的GROUP BY的非标准扩展,它允许以效率的名义进行奇怪的行为。这个扩展让世界上无数的开发人员能够在生产代码中使用GROUP BY,而不了解他们在做什么。

特别是,在SELECT *查询中使用GROUP BY是愚蠢的,因为标准的GROUP BY子句需要枚举列。许多开发人员都是这样愚蠢的。

看看这个。https://dev.mysql.com/doc/refman/5.7/en/group-by-handling.html

MySQL团队一直在试图修复这个错误特性,而不会造成生产代码的混乱。他们在5.7.5中添加了一个sql_mode标志,名为ONLY_FULL_GROUP_BY,以强制执行标准行为。在最近发布的一个版本中,默认情况下,他们打开了该标志。当您将本地MySQL升级到5.7.14时,标志被打开,依赖于旧扩展的生产代码停止工作。

你的选择?

  1. 修复违规的SQL查询,或者让插件作者这样做。
  2. 回滚到与您使用的应用软件兼容的MySQL版本。
  3. 更改服务器的sql_mode以摆脱新设置的ONLY_FULL_GROUP_BY模式。

您可以通过执行SET命令来更改模式。

代码语言:javascript
复制
SET  sql_mode = 'STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION'

如果您在应用程序连接到MySQL之后立即执行此操作,则应该执行此操作。

或者,您可以找到MySQL安装中的init文件,定位sql_mode=行,并将其更改为省略ONLY_FULL_GROUP_BY,然后重新启动服务器。

第一个冒犯的问题?将sort_order添加到GROUP BY子句中,如下所示。

代码语言:javascript
复制
select flosch_slideshow_slides.slideshow_id, count(*) as count
  from flosch_slideshow_slides
 where flosch_slideshow_slides.slideshow_id in (2, 1)
 group by flosch_slideshow_slides.slideshow_id, sort_order
 order by sort_order asc

这会破坏什么吗?可能不会。

你的第二个冒犯的问题?它包含SELECT *,因此在修复GROUP BY子句之前,您必须解开围绕查询的代码,以确定实际使用了哪些列。如果这是一个插件,这个工作最好由作者来完成。

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

https://stackoverflow.com/questions/41182801

复制
相关文章

相似问题

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