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

Mysql SQLSTATE[42000]:语法错误或访问冲突:选择列表的1055表达式3不在GROUP BY子句中,并且包含未聚合的,mysql,ubuntu,yii2,Mysql,Ubuntu,Yii2,当我把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 function

当我把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

如何解决我的问题

在select中,如果您有一个聚合函数sum和一组列名,则错误会告诉您没有在group by子句中指定正确的列名列表。可能是您应该在组中添加更多的列名称,可能与profile\u details、opportunity\u conditions表相关

你还有,机会,身份,机会,金钱, opportunity.mantaghe,如果需要总和,为什么必须将总和添加到所有列

sum(opportunity.id), sum(opportunity_conditions.money),
苏姆曼塔格

否则,如果这些列是普通列,则应使用不带

opportunity.id,opportunity\u条件,金钱,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`,  
运行:

然后有选择地将输出复制到笔记的某个位置,以防以后要恢复到原始设置

对于您的MySQL服务器实例:

mysql> SET GLOBAL sql_mode=(SELECT REPLACE(@@sql_mode,'ONLY_FULL_GROUP_BY',''));
如果您想回滚,可以运行mysql>SET-GLOBAL sql\u mode='ONLY\u FULL\u GROUP\u BY,STRICT\u TRANS\u TABLES,NO\u ZERO\u IN\u DATE,NO\u ZERO\u DATE,ERROR\u FOR\u DIVISION\u BY\u ZERO,NO\u ENGINE\u SUBSTITUTION';使用您保存的值

一种更持久的方法是使用MySQL配置,它可以在MySQL重启后继续生存。转到/etc/mysql/my.cnf,或者您可能需要运行sudo vim/etc/mysql/mysql.conf.d/mysql.cnf:

为添加一个部分 [mysqld]并在其右下方添加语句 sql\u mode=或类似sql\u mode=严格的\u TRANS\u表、日期中没有\u ZERO\u、日期中没有\u ZERO\u、错误\u除以\u ZERO、没有\u引擎\u替换

重新启动MySQL服务:

 sudo systemctl restart mysql
或sudo服务mysql重启


另请参见

Thx,这对我有帮助,但这不会永久设置它,每次重新启动后它都会恢复

因此,您应该在[mysqld]部分的配置文件中进行设置,例如/etc/mysql/my.cnf,以便在mysql重新启动后更改仍然有效:

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

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

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

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

在使用MySql的laravel中,转到文件config/database.php,它在array 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,
    ],
],

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

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

[mysqld]
sql-mode=""
然后重新启动

sudo systemctl restart mysql

适用于Ubuntu18.04。

只需将以下内容设置为strict false

Config > database.php  set 'strict' => false,
可以对非聚合列使用任何_值。因此,您可以使用:

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

更多详细信息。

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

[mysqld]
sql模式=

最好将查询更新为:

    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时,您应该只从您分组依据的表中选择列,但如果不包含group by,则应该使用any_value函数调用其他表中的列

我个人尝试不更新sql_模式全局变量


您可以在

如何回滚上了解更多信息?即使答案似乎有效,我也建议不要放置代码图像,而是放置代码本身。然后,OP就可以复制/粘贴,而不会在复制过程中出现拼写错误的风险。这是laravel用户面对问题分组的完美答案。我对这个答案非常乐观,但不幸的是,它对我没有帮助,即使我还运行了php artisan config:clear。对不起,它对我起到了作用,突然,这确实在今天开始对我起作用,谢谢。我正在使用WSL1和MySQL 8。但我不确定是否要将strict设置为false,因为很不幸,错误再次返回,但再次运行命令修复了它。我不知道它为什么会回来。我给你放了一个youtube链接,请尝试访问并观看如何修复youtube视频显示如何删除phpmyadmin中的严格的所有表。删除此项并保存并不能解决问题。没有任何变化。运行SET-GLOBAL sql\u mode=选择替换@@sql\u mode,'ONLY\u FULL\u GROUP\u BY',;由于phpmyadmin中的SQL查询暂时解决了这个问题,但一段时间后它会自动返回。我还必须将[mysqld]SQL mode=to/etc/mysql/my.cnf添加到/etc/mysql/my.cnf中,因为在重新启动mysql服务时,问题再次出现。这样做的安全含义是什么?
    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