首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >SELECT list不在GROUP BY子句中,包含非聚合列.与sql_mode=only_full_group_by不兼容

SELECT list不在GROUP BY子句中,包含非聚合列.与sql_mode=only_full_group_by不兼容
EN

Stack Overflow用户
提问于 2017-01-27 05:27:28
回答 28查看 669.9K关注 0票数 361

我的windows PC和WAMP服务器正在使用MySQL 5.7.13

这里我的问题是在执行这个查询时

代码语言:javascript
运行
复制
SELECT *
FROM `tbl_customer_pod_uploads`
WHERE `load_id` = '78' AND
      `status` = 'Active'
GROUP BY `proof_type`

我总是犯这样的错误

SELECT list的表达式#1不是按子句分组,而是包含非聚合列'returntr_prod.tbl_customer_pod_uploads.id‘,它在功能上不依赖于GROUP子句中的列;这与sql_mode=only_full_group_by不兼容。

你能告诉我最好的解决办法吗..。

我需要这样的结果

代码语言:javascript
运行
复制
+----+---------+---------+---------+----------+-----------+------------+---------------+--------------+------------+--------+---------------------+---------------------+
| 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 |
+----+---------+---------+---------+----------+-----------+------------+---------------+--------------+------------+--------+---------------------+---------------------+
EN

回答 28

Stack Overflow用户

回答已采纳

发布于 2017-01-27 05:44:32

SELECT list的表达式#1不是按子句分组,而是包含非聚合列'returntr_prod.tbl_customer_pod_uploads.id‘,它在功能上不依赖于GROUP子句中的列;这与sql_mode=only_full_group_by不兼容。

只需通过以下命令更改MySQL中的sql模式即可解决,

代码语言:javascript
运行
复制
SET GLOBAL sql_mode=(SELECT REPLACE(@@sql_mode,'ONLY_FULL_GROUP_BY',''));

这也适用于我..。我使用它,因为在我的项目中有许多类似这样的查询,所以我只是将这个sql模式更改为only_full_group_by。

或简单地包含SELECT语句指定的GROUP BY子句中的所有列。可以让sql_mode保持启用状态。

谢谢..。:-)

票数 521
EN

Stack Overflow用户

发布于 2017-01-27 05:34:19

当MySQL的only_full_group_by模式打开时,这意味着在使用GROUP BY时将应用严格的ANSI规则。对于您的查询,这意味着如果您选择了GROUP BYproof_type列,那么您只能选择两件事:

  • proof_type列,或
  • 任何其他列的集合

对于其他列的“聚合”,我的意思是将聚合函数(如MIN()MAX()AVG() )与另一列一起使用。因此,在您的示例中,以下查询将是有效的:

代码语言:javascript
运行
复制
SELECT proof_type,
       MAX(id) AS max_id,
       MAX(some_col),
       MIN(some_other_col)
FROM tbl_customer_pod_uploads
WHERE load_id = '78' AND
      status = 'Active'
GROUP BY proof_type

我看到的绝大多数MySQL GROUP BY问题都关闭了严格模式,因此查询正在运行,但结果不正确。在您的例子中,查询根本不运行,迫使您考虑真正想要做什么。

注意: ANSI扩展了允许在GROUP BY中选择的内容,还包括在功能上依赖于所选列的列。函数依赖的一个例子是按表中的主键列进行分组。由于主键对于每个记录都是唯一的,因此也将确定任何其他列的值。MySQL是允许这样做的数据库之一( Server和Oracle )。

票数 183
EN

Stack Overflow用户

发布于 2018-08-01 09:01:18

ONLY_FULL_GROUP_BY引擎中有一个系统变量MySql。

MySQLVersion5.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子句中命名,也不是在功能上依赖于它们。

若要解决此问题,请使用任何一种解决方案(以下为3)。

(1) PHPMyAdmin

禁用ONLY_FULL_GROUP_BY模式

如果您正在使用sql_mode,那么更改下面的屏幕截图中提到的phpMyAdmin设置。

编辑sql mode变量并从值中删除ONLY_FULL_GROUP_BY文本

(2) SQL/命令提示符

通过运行以下命令禁用ONLY_FULL_GROUP_BY模式。

代码语言:javascript
运行
复制
SET GLOBAL sql_mode=(SELECT REPLACE(@@sql_mode,'ONLY_FULL_GROUP_BY',''));

SELECT * (3)不要使用

不会禁用ONLY_FULL_GROUP_BY模式,但是

SELECT查询中使用相关列。相关的意思是列,它们要么出现在group by子句中,要么带有聚合函数的列(MAXMINSUMCOUNT等)。

重要注

使用point(1) OR point(2)所做的更改不会永久地设置它,每次重新启动后它都会恢复。

因此,您应该在您的配置文件中设置它(例如,在/etc/mysql/my.cnf部分中的[mysqld]部分),以便在MySQL重新启动后这些更改仍然有效:

Config文件/etc/mysql/my.cnf

变量名sql_mode sql-mode

从值中删除word ONLY_FULL_GROUP_BY并保存文件。

备注:如果您没有在配置文件中找到sql_mode变量,请在文件末尾插入以下2行

代码语言:javascript
运行
复制
[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
票数 177
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41887460

复制
相关文章

相似问题

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