MySQL #1140 - GROUP 列的混合

Posted

技术标签:

【中文标题】MySQL #1140 - GROUP 列的混合【英文标题】:MySQL #1140 - Mixing of GROUP columns 【发布时间】:2009-08-07 11:07:01 【问题描述】:

您好,想知道是否有人可以对以下错误有所了解。 sql 在本地工作正常,但我远程收到以下错误。

SQL查询:

   SELECT COUNT(node.nid), 
          node.nid AS nid, 
          node_data_field_update_date.field_update_date_value AS node_data_field_update_date_field_update_date_value
     FROM node node
LEFT JOIN content_type_update node_data_field_update_date ON node.vid = node_data_field_update_date.vid
    WHERE node.type IN ('update')
ORDER BY node_data_field_update_date_field_update_date_value DESC

mysql 说:

#1140 - 混合 GROUP 列 (MIN(),MAX(),COUNT(),...) GROUP 列是非法的,如果有 没有 GROUP BY 子句`

【问题讨论】:

当您不执行 GROUP BY 时,您希望 "COUNT(node.nid)" 返回什么? 【参考方案1】:

您的服务器可能打开了ONLY_FULL_GROUP_BY。您可以将其关闭或将您选择的每个字段添加到分组依据。

【讨论】:

【参考方案2】:

使用aggregate function 的单个列有效而不使用聚合函数的列的版本不起作用的原因是您需要指定GROUP BY 子句。您的查询应如下所示:

   SELECT COUNT(n.nid), 
          n.nid, 
          ctu.field_update_date_value
     FROM NODE n
LEFT JOIN CONTENT_TYPE_UPDATE ctu ON ctu.vid = n.vid
    WHERE n.type IN ('update')
 GROUP BY n.nid, ctu.field_update_date_value
 ORDER BY field_update_date_value DESC

我将您的表格别名更改为更短的别名 - 更易于阅读。这是您的问题的实质:

   SELECT n.nid,
          COUNT(n.fake_example_column),                
          ctu.field_update_date_value
      ...
 GROUP BY n.nid, ctu.field_update_date_value

我更改了示例以使用假列,以突出需要如何定义 GROUP BY。在GROUP BY 提及您引用的任何未包含在聚合函数中的列。我说 应该 因为MySQL is the only db I'm aware of that supports a GROUP BY where you can selectively omit columns - 有很多关于为什么查询可以在 MySQL 上工作但不能在不更改其他数据库的情况下移植的问题。显然,在您的情况下,您仍然需要至少定义一个。

【讨论】:

你能用另一个例子解释一下吗【参考方案3】:

在 Laravel 框架中,在 config 文件夹的数据库文件中设置 'strict' => false 将解决此问题。

【讨论】:

【参考方案4】:

当你在 sql 中使用 sum(),min(),max() 等聚合函数时,你必须使用 group by

但在最新的 sql 中,你也必须使用 select 中的所有列作为一个组。

为此在您在 config->database 中使用的 laravel 项目中

'严格' => 假,

并通过运行 php artisan config:cache 清除配置缓存。

我认为这对你会更有帮助。

【讨论】:

【参考方案5】:

将其剥离为基础:

   SELECT COUNT( node.nid ) 
     FROM node node
LEFT JOIN content_type_update node_data_field_update_date ON node.vid = node_data_field_update_date.vid
    WHERE node.type IN ('update')
 ORDER BY node_data_field_update_date.field_update_date_value DESC

【讨论】:

【参考方案6】:

我在旧版本的 MySQL 5.0 中遇到了同样的问题。 在较新的 5.5 版本中它可以工作!

SELECT COUNT(*), id
FROM `cities` AS `c`

【讨论】:

【参考方案7】:

我也发生了同样的事情。只需按照以下说明操作:

    在laravel中,转到config/database.php 搜索'strict'=>true 属性并将其更改为'strict'=>false。 php 工匠优化

那么我希望你修复它。再见!

【讨论】:

以上是关于MySQL #1140 - GROUP 列的混合的主要内容,如果未能解决你的问题,请参考以下文章

1140 In aggregated query without GROUP BY, expression #1 of SELECT list contains nonaggregated colum

混合组列与无组列

MYSQL - GROUP_CONCAT 和 FIND_IN_SET 混合值/顺序?

Mysql - GROUP_CONCAT - 其他/合并列的控制顺序

具有 3 列的 MYsql GROUP_CONCAT 在 PHP 中执行

MYSQL GROUP BY 具有特定列的值对