首页 > 解决方案 > A.* 不在 GROUP BY 中,在 laravel 查询生成器上使用左连接

问题描述

   $search_alls=
    DB::table('a16s as A')
    ->select('A.id')
    // ->select('A.*')
    ->addSelect(DB::raw('SUM(CASE WHEN B.approve = 1 ELSE 0 END) as Yshow'))
    ->leftjoin('a16s_likes as B', function($join) {
        $join->on('A.id', '=', 'B.p_id');
        })
    ->groupBy('A.id')
    ->get();

当我使用上面的 select('A.id') 时效果很好。

但是当我使用 select('A.*') 来选择所有 A cloumn 我得到了错误

SQLSTATE[42000]: Syntax error or access violation: 1055 'employee.A.name' isn't in GROUP BY 

PS:employee 是我的数据库名称 A 表上的列是

id name ....
1  john
2  mary
3  susan

如何通过leftjoin选择所有列?A.id 列与 B.p_id 列是一对多的关系。

标签: mysqllaravelgroup-byleft-joinlaravel-query-builder

解决方案


要解决此问题,您需要在选择列表和 group by 子句中指定所需的列

$search_alls=DB::table('a16s as A')
                ->select('A.id','A.name')
                ->addSelect(DB::raw('SUM(CASE WHEN B.approve = 1 ELSE 0 END) as Yshow'))
                ->leftjoin('a16s_likes as B', function($join) {
                    $join->on('A.id', '=', 'B.p_id');
                })
                ->groupBy('A.id')
                ->groupBy('A.name');
    ->get();

根据较新的版本,mysql 5.7 不允许选择列表、HAVING 条件或 ORDER BY 列表引用未在 GROUP BY 子句中命名的非聚合列的查询

12.19.3 MySQL 对 GROUP BY 的处理


根据文档

MySQL 5.7.5 及更高版本实现了功能依赖检测。如果启用了ONLY_FULL_GROUP_BY SQL 模式(默认情况下),MySQL 拒绝选择列表、HAVING 条件或 ORDER BY 列表引用非聚合列的查询,这些列既不在 GROUP BY 子句中命名,也不在功能上依赖于它们. (5.7.5之前,MySQL不检测函数依赖,默认不开启ONLY_FULL_GROUP_BY


推荐阅读