laravel groupBy报错

做个记录,在项目在本地正常,然后部署到服务器上就报错了,按网上说的改掉了mysql的配置后还是不行

最后改了一下laravel配置文件就好了,记录一下

config/database.php 下 mysql 配置的 strict 的值修改为 false

### 三级标题:错误原因分析 MySQL 报错 `ERROR 1055 (42000)` 通常出现在使用 `GROUP BY` 进行分组查询时,SELECT 子句中包含了不在 `GROUP BY` 子句中的列,且该列未使用聚合函数处理。这是由于 MySQL 的 `sql_mode` 中启用了 `ONLY_FULL_GROUP_BY` 模式[^2]。在该模式下,SQL 查询必须确保所有 SELECT 列要么是 `GROUP BY` 的列,要么是聚合函数处理的列。 例如,以下查询会触发此错误: ```sql SELECT date, time, max(delaytime) AS delaytime, sum(delaynum) AS delaynum, max(onlineCount) AS onlineCount, sum(perMinuteVerify) AS perMinuteVerify, auditor FROM verifyDelayLog WHERE `date` = '2016-06-29' GROUP BY time; ``` 其中 `auditor` 字段未在 `GROUP BY` 子句中出现,也未使用聚合函数,因此触发了错误[^2]。 ### 三级标题:解决方案 #### 方法一:修改 SQL 查询 确保 SELECT 子句中所有字段要么在 `GROUP BY` 子句中,要么使用聚合函数。例如,可以将 `auditor` 字段移除或使用 `MAX()` 函数处理: ```sql SELECT date, time, max(delaytime) AS delaytime, sum(delaynum) AS delaynum, max(onlineCount) AS onlineCount, sum(perMinuteVerify) AS perMinuteVerify, max(auditor) AS auditor FROM verifyDelayLog WHERE `date` = '2016-06-29' GROUP BY time; ``` #### 方法二:修改 `sql_mode` 设置 可以通过修改 MySQL 的 `sql_mode` 设置来禁用 `ONLY_FULL_GROUP_BY` 模式。具体操作如下: 1. **查看当前 `sql_mode` 设置**: ```sql SELECT @@sql_mode; ``` 2. **临时修改 `sql_mode`**(重启后失效): ```sql SET GLOBAL sql_mode=(SELECT REPLACE(@@sql_mode,'ONLY_FULL_GROUP_BY','')); ``` 3. **永久修改 `sql_mode`**: 在 MySQL 配置文件 `my.cnf` 或 `my.ini` 中添加以下配置: ```ini [mysqld] sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,PIPES_AS_CONCAT,ANSI_QUOTES ``` 然后重启 MySQL 服务。 #### 方法三:Laravel 框架特殊处理 如果是 Laravel 框架中遇到此问题,可以在 `config/database.php` 中将 `'strict' => true` 更改为 `'strict' => false`,以禁用严格模式[^4]。 ### 三级标题:预防措施 1. **遵循 SQL 标准**:在编写 `GROUP BY` 查询时,确保所有 SELECT 列要么在 `GROUP BY` 子句中,要么使用聚合函数处理。 2. **定期检查 `sql_mode` 设置**:确保 `sql_mode` 设置符合当前应用的需求,避免因模式变更导致查询失败。 3. **使用 ORM 工具时注意配置**:对于 Laravel 等框架,注意数据库连接配置中的严格模式设置。 ### 三级标题:总结 `ERROR 1055 (42000)` 是由于 MySQL 的 `ONLY_FULL_GROUP_BY` 模式导致的常见错误。解决方法包括修改 SQL 查询、调整 `sql_mode` 设置以及特定框架(如 Laravel)的配置调整。通过遵循 SQL 标准和定期检查配置,可以有效预防此类错误的发生。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值