【问题标题】:October CMS - SQL request incompatible with sql_mode=only_full_group_by十月 CMS - SQL 请求与 sql_mode=only_full_group_by 不兼容
【发布时间】:2017-05-02 03:44:53
【问题描述】:

我在本地环境中有一个奇怪的问题: wamp64 mysql 5.7.14 十月CMS 382

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

语法错误或访问冲突:ORDER BY 的 1055 表达式 #1 子句不在 GROUP BY 子句中并且包含非聚合列 'dbname.flosch_slideshow_slides.sort_order' 不是 功能上依赖于 GROUP BY 子句中的列;

这与 sql_mode=only_full_group_by 不兼容

(SQL:

选择flosch_slideshow_slides.slideshow_id,count(*) 作为计数

来自flosch_slideshow_slides

flosch_slideshow_slides.slideshow_id 在 (2, 1) 中的位置

按flosch_slideshow_slides.slideshow_id分组

按sort_orderasc 订购

)

其他示例略有不同。这个尝试在前端显示产品列表

SQLSTATE[42000]:语法错误或访问冲突:1055 表达式 #51 的 SELECT 列表不在 GROUP BY 子句中并且包含非聚合 列“dbname.jiri_jkshop_products_categories.category_id” 它在功能上不依赖于 GROUP BY 子句中的列;

这与 sql_mode=only_full_group_by 不兼容

(SQL:

select * from jiri_jkshop_products 内连接 jiri_jkshop_products_categories id = jiri_jkshop_products_categories.product_id 其中active = 1 和 category_id in (8) and visibility = 1 group by id order by titleasc

)

这些请求在此处触发:

Backend\Behaviors\ListController->listRender()

所以我没有手

我指定它在远程服务器和我伙伴的本地环境中都能完美运行

另一个有趣的点是,因为我应用了系统的最新更新(从版本 365 到 382)并安装了所有插件。然后,为了测试,我在远程服务器上做了同样的事情,它仍然有效

因为我主要在本地工作,所以这很烦人

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

感谢和问候, 帕特里克

【问题讨论】:

标签: mysql group-by octobercms mysql-error-1055


【解决方案1】:

长期以来,MySQL 包含一个臭名昭著的非标准扩展 GROUP BY,它允许以效率为名的古怪行为。这个扩展让世界各地无数的开发人员可以在生产代码中使用GROUP BY,而无需了解他们在做什么。

尤其是在GROUP BY 查询中使用SELECT * 是愚蠢的,因为标准的GROUP BY 子句需要枚举列。很多开发者都这么傻了。

阅读本文。 https://dev.mysql.com/doc/refman/5.7/en/group-by-handling.html

MySQL 团队一直在尝试在不弄乱生产代码的情况下修复此错误功能。他们在 5.7.5 中添加了一个名为 ONLY_FULL_GROUP_BY 的 sql_mode 标志以强制执行标准行为。在最近的版本中,他们默认打开了该标志。当您将本地 MySQL 升级到 5.7.14 时,该标志已打开,并且依赖于旧扩展的生产代码停止工作。

你的选择?

  1. 修复有问题的 SQL 查询,或让插件作者这样做。
  2. 回滚到与您使用的应用软件开箱即用兼容的 MySQL 版本。
  3. 更改服务器的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 后立即执行此操作,应该可以解决问题。

或者,您可以找到the init file in your MySQL installation,找到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 子句之前,您必须解开查询周围的代码以找出实际使用了哪些列。如果这是一个插件,那么这项工作最好由其作者完成。

【讨论】:

  • 感谢琼斯先生,非常感谢,很棒的回复,所以我通知插件的作者并尝试修复涉及的查询。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-05-12
  • 1970-01-01
  • 2018-03-12
  • 2020-02-29
  • 2016-07-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多