only_full_group_by : "ORDER BY 子句不在 GROUP BY 子句中"

Posted

技术标签:

【中文标题】only_full_group_by : "ORDER BY 子句不在 GROUP BY 子句中"【英文标题】:only_full_group_by : "ORDER BY clause is not in GROUP BY clause" 【发布时间】:2018-03-23 02:11:16 【问题描述】:

mysql 新版本的问题 only_full_group_by

我需要使用 Group by (col_id) 和 order by (date) 来获取表值 我在mysql中的代码如下:

SELECT COUNT(created_date) AS `Rows` , ANY_VALUE(id) 
FROM `table` where `my_id` = 1 AND `status` = '0' 
GROUP BY `id` 
ORDER BY `created_date` DESC

我收到如下错误

SQLSTATE[42000]:语法错误或访问冲突:1055 ORDER BY 子句的表达式 #1 不在 GROUP BY 子句中,并且包含在功能上不依赖于 GROUP BY 子句中的列的非聚合列“database.table.created_date” ;这与 sql_mode=only_full_group_by 不兼容

有人说解决方法吗?

提前谢谢...

【问题讨论】:

禁用 only_full_group_by mysql> set global 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> set session sql_mode='STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION'; Error related to only_full_group_by when executing a query in MySql的可能重复 GROUP BY 错误的全部意义在于它们表示逻辑错误。不可能ORDER BY created_date,因为SELECT 子句中没有这样的表达式,并且每个组可能包含created_date 的两个或更多不同的值。哪一个用于排序?禁用sql_mode 并不能解决问题,只会让 MySQL 返回不确定的结果。 【参考方案1】:

使用“仅完整分组依据”,order by 不能是任意列。 order bygroup by 之后被解析,因此只允许聚合键和聚合列。

你可以使用:

SELECT COUNT(created_date) AS `Rows`, ANY_VALUE(id)
FROM `table` 
WHERE `my_id` = 1 AND `status` = '0'
GROUP BY `id`
ORDER BY ANY_VALUE(`created_date`) DESC;

如果我不得不猜测,你实际上想要MAX()

ORDER BY MAX(`created_date`) DESC;

【讨论】:

以上是关于only_full_group_by : "ORDER BY 子句不在 GROUP BY 子句中"的主要内容,如果未能解决你的问题,请参考以下文章

MySql 中与 only_full_group_by 相关的错误

问题:only_full_group_by

only_full_group_by 模式有啥好处?

绕过 only_full_group_by 限制[重复]

MySQL 5.7默认ONLY_FULL_GROUP_BY语义介绍

MYSQL5.7 sql_mode=only_full_group_by