MySql group by条件不起作用的地方

问题描述 投票:0回答:1

我有2个表,问题。我需要这样的结果,即它包含组名和相应的未删除的问题计数。这两个表的结构和数据如下。

groups-table

enter image description here

我的预期结果如下

enter image description here

我尝试了以下代码,但是它给出了包括已删除问题的整个行。

$groupname = DB::table('groups as d')
        ->select([
            'd.id','d.group_name',DB::raw("count(dtls.survey_group_id) as count")
        ])
        ->leftJoin('questions as dtls','d.id', '=', 'dtls.survey_group_id')
        ->whereNotExists( function ($query) {
            $query->select(DB::raw(1))
            ->from('questions')
            ->where('id', 'd.id')
            ->where('dtls.is_deleted', 1);
        })
        ->groupBy('d.id','d.group_name')
        ->get()
        ->toArray();
mysql laravel left-join
1个回答
0
投票

这里的问题是->where('id', 'd.id')用文字字符串id来组合d.id,这显然不是您想要的。此外,内部查询表应使用别名以避免歧义。您可以尝试将其更改为:

$groupname = DB::table('groups as d')
        ->select([
            'd.id','d.group_name',DB::raw("count(dtls.survey_group_id) as count")
        ])
        ->leftJoin('questions as dtls','d.id', '=', 'dtls.survey_group_id')
        ->whereNotExists( function ($query) {
            $query->select(DB::raw(1))
            ->from('questions as innerDtls')
            ->whereRaw('innerDtls.id = d.id')
            ->where('dtls.is_deleted', 1);
        })
        ->groupBy('d.id','d.group_name')
        ->get()
        ->toArray();

或者,您当前的查询可以简化为:

$groupname = DB::table('groups as d')
        ->select([
            'd.id','d.group_name',DB::raw("count(dtls.survey_group_id) as count")
        ])
        ->leftJoin('questions as dtls','d.id', '=', 'dtls.survey_group_id')
        ->where('dtls.is_deleted', 0)
        ->groupBy('d.id','d.group_name')
        ->get()
        ->toArray();
© www.soinside.com 2019 - 2024. All rights reserved.