Heim > Fragen und Antworten > Hauptteil
P粉5236250802023-08-21 10:10:51
在MySQL引擎中有一个系统变量ONLY_FULL_GROUP_BY
。
从MySQL版本5.7.5开始:默认情况下启用ONLY_FULL_GROUP_BY
SQL模式。
在5.7.5版本之前:默认情况下未启用ONLY_FULL_GROUP_BY
。
如果启用了ONLY_FULL_GROUP_BY
SQL模式(从5.7.5版本开始默认启用),MySQL将拒绝查询选择列表、HAVING
条件或ORDER BY
列表引用非聚合列,这些列既不在GROUP BY
子句中命名,也不与其功能相关。
(1) PHPMyAdmin
禁用:ONLY_FULL_GROUP_BY
模式
如果您使用的是phpMyAdmin,则根据下面的截图更改sql_mode
设置。
编辑sql mode
变量并从值中删除ONLY_FULL_GROUP_BY
文本
或者
(2) SQL/命令提示符
通过运行以下命令禁用:ONLY_FULL_GROUP_BY
模式。
SET GLOBAL sql_mode=(SELECT REPLACE(@@sql_mode,'ONLY_FULL_GROUP_BY',''));
或者
(3) 不要使用SELECT *
不要禁用ONLY_FULL_GROUP_BY
模式,而是
在SELECT
查询中使用相关列。相关列指的是在group by
子句中出现的列或带有聚合函数(MAX
、MIN
、SUM
、COUNT
等)的列
使用点(1)或点(2)
进行的更改不是永久设置,每次重新启动后都会还原。
因此,您应该在配置文件中设置此项(例如,在[mysqld]
部分的/etc/mysql/my.cnf
文件中),以便在MySQL重新启动后保持更改生效:
配置文件:/etc/mysql/my.cnf
变量名:sql_mode
或 sql-mode
从值中删除ONLY_FULL_GROUP_BY
一词并保存文件。
注意:如果在配置文件中找不到sql_mode
变量,请在文件末尾插入以下2行
[mysqld] sql_mode = STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
P粉1210816582023-08-21 00:49:48
这个问题可以通过在MySQL中更改sql模式来简单解决,使用以下命令:
SET GLOBAL sql_mode=(SELECT REPLACE(@@sql_mode,'ONLY_FULL_GROUP_BY',''));
对我也有效...
我使用了这个方法,因为在我的项目中有很多类似的查询,所以我只是将sql模式更改为only_full_group_by。
或者简单地在GROUP BY子句中包含SELECT语句指定的所有列。可以保持启用sql_mode。
谢谢... :-)
更新日期:2023年7月14日
更改SQL模式是一种解决方法,但是对于结构化查询语言的最佳实践是避免选择所有(SELECT * ...)列,而是在分组列上使用聚合函数,如@Tim Biegeleisen在下面的回答中提到的https://stackoverflow.com/a/41887524/3602846