MySQL 5.0.12 - 列表不在 GROUP BY 子句中并且包含非聚合列?
Posted
技术标签:
【中文标题】MySQL 5.0.12 - 列表不在 GROUP BY 子句中并且包含非聚合列?【英文标题】:MySQL 5.0.12 - list is not in GROUP BY clause and contains nonaggregated column? 【发布时间】:2016-12-12 22:50:15 【问题描述】:为什么我在mysqlnd 5.0.12-dev
上收到此错误:
1055 - SELECT 列表的表达式 #29 不在 GROUP BY 子句中,并且包含不是的非聚合列 'db_name.p2.url'
在功能上依赖于 GROUP BY 子句中的列;这是 与 sql_mode=only_full_group_by 不兼容
查询:
SELECT p.* ,
p2.article_id AS parent_id ,
p2.url AS parent_url ,
p3.article_id AS parent_parent_id ,
p3.url AS parent_parent_url ,
p3.title AS parent_parent_title
FROM article AS p
LEFT JOIN article AS p2
ON p2.article_id = p.parent_id
AND p.article_id <> p2.article_id
LEFT JOIN article AS p3
ON p3.article_id = p2.parent_id
AND p2.article_id <> p3.article_id
WHERE p.url = 'contact'
AND p.type = 'page'
AND p.hide = '0'
GROUP BY p.article_id
ORDER BY p.backdated_on DESC
查询在mysqlnd 5.0.11-dev
上正常工作。
有什么想法吗?
【问题讨论】:
顺便说一句:您使用的 MySQL 版本大约有 11 年的历史。您使用这么旧的版本有什么原因吗? 我不知道为什么我从命令行sudo apt-get install mysql-server mysql-client
得到那个版本的mysql,我是从安装mysql 的在线指南中遵循的。那么安装最新mysql的正确命令行是什么?
更多信息:mysql -V
输出:mysql Ver 14.14 Distrib 5.7.13, for Linux (x86_64) using EditLine wrapper
但在 phpmyadmin 的屏幕上,它会打印以下信息:Database client version: libmysql - mysqlnd 5.0.12-dev - 20150407 - $Id: 241ae00989d1995ffcbbf63d579943635faf9972 $
【参考方案1】:
您的 group by 子句似乎只包含 p.article_id
而您的选择有
p.* ,
p2.article_id AS parent_id ,
p2.url AS parent_url ,
p3.article_id AS parent_parent_id ,
p3.url AS parent_parent_url ,
p3.title AS parent_parent_title
要么将所有选择查询列包含在 group by 中,要么将它们包装在聚合函数中,例如 sum()、count()、max() 等。 您到底想从这个查询中得到什么?
【讨论】:
【参考方案2】:错误很明显:
在功能上依赖于 GROUP BY 子句中的列;这是 与 sql_mode=only_full_group_by 不兼容
默认情况下,MySQL 允许使用您所拥有的查询结构。当您的服务器更新时,有人(明智地,恕我直言)设置了 SQL 模式,因此引擎将不支持此功能。
不清楚你想做什么。但我猜GROUP BY
甚至没有必要:
SELECT p.* ,
p2.article_id AS parent_id ,
p2.url AS parent_url ,
p3.article_id AS parent_parent_id ,
p3.url AS parent_parent_url ,
p3.title AS parent_parent_title
FROM article p LEFT JOIN
article p2
ON p2.article_id = p.parent_id AND
p.article_id <> p2.article_id LEFT JOIN
article p3
ON p3.article_id = p2.parent_id AND
p2.article_id <> p3.article_id
WHERE p.url = 'contact' AND p.type = 'page' AND p.hide = '0'
ORDER BY p.backdated_on DESC ;
如果不知何故你得到了重复,那么你可能想要SELECT DISTINCT
。
如果这仍然不能解决您的问题,请问另一个问题(因为这个问题已经有多个答案可以解决问题中的语法问题)。提供示例数据和所需结果,以及您开始工作的查询。
【讨论】:
以上是关于MySQL 5.0.12 - 列表不在 GROUP BY 子句中并且包含非聚合列?的主要内容,如果未能解决你的问题,请参考以下文章
MySQL - 使用不在列表中的列对 Group By 语句排序 [重复]
SELECT 列表不在 GROUP BY 子句中,并且包含非聚合列 [重复]
MYsql5.7版本之后,用group by查询不在分组字段遇到的坑
#1055 - SELECT 列表的表达式不在 GROUP BY 子句中,并且包含非聚合列,这与 sql_mode=only_full_group_by 不兼容
MySql 中与 only_full_group_by 相关的错误
SQLSTATE [42000]:语法错误或访问冲突:1055 SELECT 列表的表达式 #3 不在 GROUP BY 子句中并且包含非聚合