A.* 不在 Laravel 查询生成器上带有左连接的 GROUP BY 中

rob*_*pin 2 mysql group-by left-join laravel laravel-query-builder

   $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();
Run Code Online (Sandbox Code Playgroud)

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

但是当我使用 select('A.*') 选择所有 A 列时,出现错误

SQLSTATE[42000]: Syntax error or access violation: 1055 'employee.A.name' isn't in GROUP BY 
Run Code Online (Sandbox Code Playgroud)

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

id name ....
1  john
2  mary
3  susan
Run Code Online (Sandbox Code Playgroud)

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

M K*_*aid 5

要解决此问题,您需要在选择列表和分组依据子句中指定所需的列

$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();
Run Code Online (Sandbox Code Playgroud)

根据较新版本,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