当我将 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
如何解决我的问题?
运行:
sudo mysql -u root -p
mysql> SELECT @@global.sql_mode;
(然后可以选择将输出复制到笔记中的某个位置,以防您稍后想要恢复到原始设置。)
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
)
在带有 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,
],
],
解决方案是编辑 MySQL 配置文件,因为每次重新启动后配置都会恢复...
sudo nano /etc/mysql/mysql.conf.d/mysqld.cnf
并添加
[mysqld]
sql-mode=""
然后重新启动
sudo systemctl restart mysql
适用于 ubuntu 18.04。
请复制此行并运行它。它对我有用。
SET GLOBAL sql_mode=(SELECT REPLACE(@@sql_mode,'ONLY_FULL_GROUP_BY',''));
在 select 中,您有一个名为 sum 的聚合函数和一组列名,错误告诉您没有在 group by 子句中指定正确的列名列表。可能您应该在组中添加更多列名称,可能与
profile_details, opportunity_conditions
表相关
您还知道
,(opportunity.id),(opportunity_conditions.money), (opportunity.mantaghe),
为什么()
如果您需要总和,则必须将总和添加到所有列
sum(opportunity.id), sum(opportunity_conditions.money),
sum(机会.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`opportunity`.`id`, `profile_details`.`user_id`,`opportunity_conditions.money`,
在 Laravel
SQLSTATE[42000]:语法错误或访问冲突:1055 SELECT 列表的表达式 #1 不在 GROUP BY 子句中,并且包含非聚合列“turn.barnamehs.id”,该列在功能上不依赖于 GROUP BY 子句中的列;这与 sql_mode=only_full_group_by 不兼容 从
tables
选择 *,其中日期(end_date
) >= 2022-05-10 00:00:00 按 speciality_id
分组
解决方案:在 config/database.php 中更改 'strict' => false
只需将以下内容设置为 strict false
Config > database.php set 'strict' => false,
最好将您的查询更新为:
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
阅读更多相关信息Thx,这对我有帮助,但这不会设置它永久,并且每次重新启动后它都会恢复。
因此,您应该在配置文件中进行此设置(例如 [mysqld] 部分中的 /etc/mysql/my.cnf),以便更改在 MySQL 重新启动后仍然有效:
配置文件:/etc/mysql/my.cnf
[mysqld]
sql-mode="STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION"
对于 CentOS8,我使用 webmin 配置文件
/etc/my.cnf.d/mysql-server.cnf
[mysqld]
sql-mode=""
您可以对非聚合列使用
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
更多详情这里。
sudo mysql -u root -p
mysql > SET GLOBAL sql_mode=(SELECT REPLACE(@@sql_mode,'ONLY_FULL_GROUP_BY',''));
(已解决)只需在
Group By
子句中包含所有选定的列即可,请看下面的示例
无效
SELECT o.custid, c.name, MAX(o.payment)
FROM orders AS o, customers AS c
WHERE o.custid = c.custid
GROUP BY o.custid;
有效(在此查询中,我们仅将
c.name
也包含在分组依据中)
SELECT o.custid, c.name, MAX(o.payment)
FROM orders AS o, customers AS c
WHERE o.custid = c.custid
GROUP BY o.custid,**c.name**;
欲了解更多信息,请访问主要来源
适用于 UBUNTU 22.04LTS
打开文件进行编辑
$ sudo nano /etc/mysql/my.cnf
然后在文件末尾添加这些行:
[mysqld]
sql-mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION