在我的本地环境中有一个奇怪的问题: 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_orderasc订购 )
另一个例子则略有不同。这个试图在前端显示产品列表的
语法错误或访问冲突: SELECT list的1055表达式#51没有按子句分组,而是包含非聚合列'dbname.jiri_jkshop_products_categories.category_id‘,它在功能上不依赖于按子句分组的列; 这与sql_mode=only_full_group_by不兼容。 (SQL: 从
jiri_jkshop_products内部连接jiri_jkshop_products_categoriesonid=jiri_jkshop_products_categories.product_id中选择*,其中active=1和category_id在(8)中,visibility=1按title的id顺序分组 )
这些请求在此触发:
Backend\Behaviors\ListController->listRender()
所以我没办法
我指定它在远程服务器和我的伙伴的本地环境中工作得很好。
另一个有趣的问题是,由于我应用了系统的最新更新(从365版到382版)和所有已安装的插件。然后,为了进行测试,我在远程服务器上做了同样的工作,而且它仍然可以工作。
因为我主要是在本地工作,这很烦人。
你有什么办法来解决它吗?理想情况下,不修改mysql/sql_mode
谢谢和问候,帕特里克
发布于 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时,标志被打开,依赖于旧扩展的生产代码停止工作。
你的选择?
sql_mode以摆脱新设置的ONLY_FULL_GROUP_BY模式。您可以通过执行SET命令来更改模式。
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子句中,如下所示。
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子句之前,您必须解开围绕查询的代码,以确定实际使用了哪些列。如果这是一个插件,这个工作最好由作者来完成。
https://stackoverflow.com/questions/41182801
复制相似问题