SELECT语句中的列没有在GROUP BY子句中,并且包含了非聚合的列....与sql_mode=only_full_group_by不兼容
P粉521748211
P粉521748211 2023-08-21 13:21:31
0
2
612
<p>我在我的Windows PC上使用MySQL 5.7.13和WAMP服务器</p> <p>我的问题是在执行这个查询时</p> <pre class="brush:php;toolbar:false;">SELECT * FROM `tbl_customer_pod_uploads` WHERE `load_id` = '78' AND `status` = 'Active' GROUP BY `proof_type`</pre> <p>我总是得到这样的错误</p> <blockquote> <p>SELECT列表中的表达式#1不在GROUP BY子句中,并且包含非聚合列'returntr_prod.tbl_customer_pod_uploads.id',该列在GROUP BY子句中的列上没有函数依赖关系; 这与sql_mode = only_full_group_by不兼容</p> </blockquote> <p>请告诉我最好的解决方案。</p> <p>我需要的结果如下</p> <pre class="brush:php;toolbar:false;">+----+---------+---------+---------+----------+-----------+------------+---------------+--------------+------------+--------+---------------------+---------------------+ | id | user_id | load_id | bill_id | latitude | langitude | proof_type | document_type | file_name | is_private | status | createdon | updatedon | +----+---------+---------+---------+----------+-----------+------------+---------------+--------------+------------+--------+---------------------+---------------------+ | 1 | 1 | 78 | 1 | 21.1212 | 21.5454 | 1 | 1 | id_Card.docx | 0 | Active | 2017-01-27 11:30:11 | 2017-01-27 11:30:14 | +----+---------+---------+---------+----------+-----------+------------+---------------+--------------+------------+--------+---------------------+---------------------+</pre> <p><br /></p>
P粉521748211
P粉521748211

全部回复(2)
P粉300541798

在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子句中出现的列或带有聚合函数(MAXMINSUMCOUNT等)的列


重要说明

使用point(1)或point(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粉278379495

This

将通过在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

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责声明 Sitemap
PHP中文网:公益在线PHP培训,帮助PHP学习者快速成长!