【问题标题】:MySQL 5.0.12 - list is not in GROUP BY clause and contains nonaggregated column?MySQL 5.0.12 - 列表不在 GROUP BY 子句中并且包含非聚合列?
【发布时间】: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 $

标签: php mysql


【解决方案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

    如果这仍然不能解决您的问题,请问另一个问题(因为这个问题已经有多个答案可以解决问题中的语法问题)。提供示例数据和所需结果,以及您开始工作的查询。

    【讨论】:

      猜你喜欢
      • 2017-06-22
      • 2016-04-27
      • 1970-01-01
      • 1970-01-01
      • 2018-06-12
      • 2017-07-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多