this is incompatible with sql_mode=only_full_group_by以及laravel设置

遇到错误

$total = $gameDataRepository->m()->where('s_uid', $id)
            ->select(['id','s_uid','r_uid'])
            ->orWhere('r_uid', $id)
            ->groupBy('s_uid','r_uid')
            ->get();

file

在数据库中原生查询同样报错

file

原因

看一下group by的语法

select 选取分组中的列+聚合函数 from 表名称 group by 分组的列

从语法格式来看,是先有分组,再确定检索的列,检索的列只能在参加分组的列中选。

我当前Mysql版本5.7.19

再看一下ONLY_FULL_GROUP_BY的意思是:对于GROUP BY聚合操作,如果在SELECT中的列,没有在GROUP BY中出现,那么这个SQL是不合法的,因为列不在GROUP BY从句中,也就是说查出来的列必须在group by后面出现否则就会报错,或者这个字段出现在聚合函数里面。

但是在实际的sql查询中我们很多时候是不需要groupBy所有select字段的.

解决办法

查看版本

select version();
mysql> select version();
+---------------+
| version()     |
+---------------+
| 5.7.19-17-log |
+---------------+
1 row in set (0.00 sec)

查看sql_model参数命令

发现果然有only_full_group_by存在

SELECT @@GLOBAL.sql_mode;
SELECT @@SESSION.sql_mode;

file

关闭only_full_group_by模式

我这里是修改配置文件,永久生效,临时修改的话,重启就失效了

//配置文件中增加这一行
sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION

重启mysql

systemctl restart mysql.service

检查模式

mysql> SELECT @@GLOBAL.sql_mode;
+------------------------------------------------------------------------------------------------------------------------+
| @@GLOBAL.sql_mode                                                                                                      |
+------------------------------------------------------------------------------------------------------------------------+
| STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION |
+------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)

再次执行sql

ok,,已经不报错了

mysql> select `id`, `s_uid`, `r_uid` from `game_data` where `s_uid` = 19 or `r_uid` = 19 group by `s_uid`, `r_uid`;
+-----+-------+-------+
| id  | s_uid | r_uid |
+-----+-------+-------+
| 376 |    14 |    19 |
| 375 |    19 |    14 |
| 340 |    19 |    23 |
| 337 |    19 |    24 |
| 381 |    19 |    28 |
| 343 |    23 |    19 |
| 338 |    24 |    19 |
| 380 |    28 |    19 |
+-----+-------+-------+
8 rows in set (0.00 sec)

虽然mysql中原生查询不报错,但是我在laravel框架中去查询还是这个报错

这个问题困扰了好久,好久..大概好几天吧

修改config/database.php

不得不佩服stackoverflow的强大啊

//把原来的true变为false
'strict' => false,

哈哈哈..这样就可以了

file