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 子句中并且包含非聚合