SQLSTATE [42000]:语法错误或访问冲突:1055 SELECT 列表的表达式 #3 不在 GROUP BY 子句中并且包含非聚合

Posted

技术标签:

【中文标题】SQLSTATE [42000]:语法错误或访问冲突:1055 SELECT 列表的表达式 #3 不在 GROUP BY 子句中并且包含非聚合【英文标题】:SQLSTATE[42000]: Syntax error or access violation: 1055 Expression #3 of SELECT list is not in GROUP BY clause and contains nonaggregated 【发布时间】:2016-08-25 08:29:39 【问题描述】:

当我将我的 ubuntu 从 15.10 升级到 16.04 时,我的 yii2 项目中出现了这个错误

SQLSTATE[42000]: Syntax error or access violation: 1055 Expression #3
of SELECT list is not in GROUP BY clause and contains nonaggregated column 
'iicityYii.opportunity_conditions.money' which is not functionally dependent 
on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by

正在执行的 SQL 是:

SELECT SUM(oc.money),op.id,oc.money,
            op.mantaghe,
            op.`time`, op.`id`, `op`.`logo`,
           `pd`.`user_id`, `op`.`name`, 
           `pd`.`co_name`, `op`.`address`, 
           `op`.`project_type_id`, `op`.`state_id`
FROM `opportunity` op 
INNER JOIN `profile_details` pd  ON op.user_id=pd.user_id  
INNER JOIN `opportunity_conditions` oc ON   op.id=oc.opportunity_id
GROUP BY `op`.`id`
ORDER BY `op`.`id` DESC

如何解决我的问题?

【问题讨论】:

【参考方案1】:

运行:

sudo mysql -u root -p
mysql> SELECT @@global.sql_mode;

(然后可以选择将输出复制到您的笔记中,以防您以后想恢复到那些原始设置。)

change the SQL Mode 用于您的 MySQL 服务器实例:

mysql> SET GLOBAL sql_mode=(SELECT REPLACE(@@sql_mode,'ONLY_FULL_GROUP_BY',''));

(如果您想回滚,可以使用您保存的值运行类似mysql> SET GLOBAL sql_mode='ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION'; 的内容。)


一种更永久的方式(将在 MySQL 重新启动后继续存在)是使用 MySQL 配置。转到/etc/mysql/my.cnf(或者您可能需要运行sudo vim /etc/mysql/mysql.conf.d/mysql.cnf):

[mysqld] 并在其正下方添加语句 sql_mode = "" 或类似sql_mode="STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION"

重启 MySQL 服务:

 sudo systemctl restart mysql

(或sudo service mysql restart

另见https://dba.stackexchange.com/a/113153/18098

【讨论】:

如何回滚?【参考方案2】:

在带有 MySql 的 laravel 中,转到文件 config/database.php 并在数组 MySql 模式中将其更改为 false。

'connections' => [
    'mysql' => [
        'driver' => 'mysql',
        'host' => env('DB_HOST', '127.0.0.1'),
        'port' => env('DB_PORT', '3306'),
        'database' => env('DB_DATABASE', 'forge'),
        'username' => env('DB_USERNAME', 'forge'),
        'password' => env('DB_PASSWORD', ''),
        'unix_socket' => env('DB_SOCKET', ''),
        'charset' => 'utf8mb4',
        'collation' => 'utf8mb4_unicode_ci',
        'prefix' => '',
        'strict' => false, //from true
        'engine' => null,
    ],
],

【讨论】:

即使答案似乎有效,我建议不要放置代码图像,而是放置代码本身。然后 OP 可以直接复制/粘贴,而不会在复制过程中出现拼写错误的风险。 针对 laravel 面向用户的分组问题的完美答案。 我对这个答案非常乐观,但不幸的是它对我没有帮助,即使我也跑了php artisan config:clear 实际上,突然间这确实开始为我工作了,所以谢谢。我将 WSL 1 与 MySQL 8 一起使用。但我不确定是否要将“严格”设置为 false,因为 ***.com/a/42104555/470749【参考方案3】:

解决方案是编辑 MySQL 配置文件,因为每次重启后配置都会恢复...

sudo nano /etc/mysql/mysql.conf.d/mysqld.cnf

并添加

[mysqld]
sql-mode=""

然后重启

sudo systemctl restart mysql

适用于 ubuntu 18.04。

【讨论】:

这样做有什么安全隐患? 在 Ubuntu 18 上运行良好。【参考方案4】:

请复制这一行并运行它。它对我有用。

SET GLOBAL sql_mode=(SELECT REPLACE(@@sql_mode,'ONLY_FULL_GROUP_BY',''));

Youtube video to fix this

【讨论】:

不幸的是错误再次返回,但再次运行命令修复它。不知道为什么它回来了。 我给你放了一个 youtube 链接,请尝试访问并观看如何修复 YouTube 视频展示了如何在 phpmyadmin 中删除 STRICT_ALL_TABLES。删除并保存并没有解决问题。完全没有变化。运行 SET GLOBAL sql_mode=(SELECT REPLACE(@@sql_mode,'ONLY_FULL_GROUP_BY',''));作为 phpmyadmin 中的 SQL 查询暂时解决了问题,但它会在一段时间后自动返回。 我还必须将[mysqld] sql-mode="" 添加到 /etc/mysql/my.cnf 因为没有那个,当重新启动 mysql 服务问题又回来了。【参考方案5】:

在 select 你有一个名为 sum 的聚合函数和一组列名,错误告诉你没有在 group by 子句中指定正确的列名列表。可能您应该在组中添加更多列名称,可能与profile_details, opportunity_conditions 表相关

你也有,(opportunity.id),(opportunity_conditions.money), (opportunity.mantaghe), 为什么()如果你需要总和你必须将总和添加到所有列

sum(opportunity.id), sum(opportunity_conditions.money),

总和(机会.mantaghe),

否则,如果这是普通列,则应使用不带 () 的普通语法

opportunity.id, opportunity_conditions.money,opportunity.mantaghe,

我试图重写一个可能的查询

 SELECT SUM(opportunity_conditions.money),
        `opportunity`.`id`,
        `opportunity_conditions.money`,
        `opportunity.mantaghe`, 
        `opportunity`.`time`, 
        `opportunity`.`logo`, 
        `profile_details`.`user_id`,
        `opportunity`.`name`, 
        `profile_details`.`co_name`,
        `opportunity`.`address`, 
        `opportunity`.`project_type_id`,
        `opportunity`.`state_id` 
FROM `opportunity` 
INNER JOIN `profile_details` ON `opportunity`.`user_id`= `profile_details`.`user_id` 7
INNER JOIN `opportunity_conditions` ON `opportunity`.`id`=`opportunity_conditions`.`opportunity_id` 
GROUP BY`opportunity`.`id`,   `profile_details`.`user_id`,`opportunity_conditions.money`,  
ORDER BY `opportunity`.`id` DESC

在基本列名上使用 group by(我希望)

GROUP BY`opportunity`.`id`,   `profile_details`.`user_id`,`opportunity_conditions.money`,  

【讨论】:

【参考方案6】:

只需在关注时设置严格的 false

Config > database.php  set 'strict' => false,

【讨论】:

【参考方案7】:

对于 CentOS8,我使用 webmin 配置文件 /etc/my.cnf.d/mysql-server.cnf

[mysqld] sql-mode=""

【讨论】:

【参考方案8】:

最好将查询更新为:

    SELECT SUM(any_value(oc.money)),op.id,any_value(oc.money) as money,
            op.mantaghe,
            op.`time`, op.`id`, `op`.`logo`,
           any_value(`pd`.`user_id`) as user_id, `op`.`name`, 
           any_value(`pd`.`co_name`) as co_name, `op`.`address`, 
           `op`.`project_type_id`, `op`.`state_id`
FROM `opportunity` op 
INNER JOIN `profile_details` pd  ON op.user_id=pd.user_id  
INNER JOIN `opportunity_conditions` oc ON   op.id=oc.opportunity_id
GROUP BY `op`.`id`
ORDER BY `op`.`id` DESC

了解 当您的查询包含group by 时,您应该只从您要分组的表中选择列,但如果没有,您应该使用any_value() 函数来调用其他表中的列。

我个人尽量不要更新 sql_mode 全局变量。

您可以在https://dev.mysql.com/doc/refman/5.7/en/group-by-handling.html上阅读更多相关信息

【讨论】:

【参考方案9】:

谢谢,这对我有帮助,但这不会永久设置它,它会在每次重启后恢复。

所以你应该在你的配置文件中设置这个(例如 [mysqld] 部分中的 /etc/mysql/my.cnf),以便在 MySQL 重新启动后更改仍然有效:

配置文件:/etc/mysql/my.cnf

[mysqld]
sql-mode="STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION"

【讨论】:

【参考方案10】:

您可以将ANY_VALUE 用于非聚合列。所以,你可以使用:

SELECT SUM(oc.money),
       op.id,
       ANY_VALUE(oc.money),
       ANY_VALUE(op.mantaghe),
       ANY_VALUE(op.`time`), op.`id`, ANY_VALUE(`op`.`logo`),
       ANY_VALUE(`pd`.`user_id`), ANY_VALUE(`op`.`name`), 
       ANY_VALUE(`pd`.`co_name`), ANY_VALUE(`op`.`address`), 
       ANY_VALUE(`op`.`project_type_id`), ANY_VALUE(`op`.`state_id`)
FROM `opportunity` op 
INNER JOIN `profile_details` pd  ON op.user_id=pd.user_id  
INNER JOIN `opportunity_conditions` oc ON   op.id=oc.opportunity_id
GROUP BY `op`.`id`
ORDER BY `op`.`id` DESC

更多详情here.

【讨论】:

以上是关于SQLSTATE [42000]:语法错误或访问冲突:1055 SELECT 列表的表达式 #3 不在 GROUP BY 子句中并且包含非聚合的主要内容,如果未能解决你的问题,请参考以下文章

Laravel 5.8 SQLSTATE [42000]:语法错误或访问冲突:1064 您的 SQL 语法有错误

SQLSTATE [42000]:语法错误或访问冲突:1064 您的 SQL 语法有错误 - LARAVEL

Cakephp SQLSTATE [42000]:语法错误或访问冲突:1064

带有消息“SQLSTATE [42000]”的未捕获异常“PDOException”:语法错误或访问冲突:

SQLSTATE [42000]:语法错误或访问冲突:1064 PHP/MySQL [关闭]

为啥我是 laravel 抛出 SQLSTATE[42000]:语法错误或访问冲突:1064 错误