MySql группа с, где условие не работает - PullRequest
0 голосов
/ 03 октября 2019

У меня есть 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();

1 Ответ

0 голосов
/ 03 октября 2019

Проблема здесь в том, что ->where('id', 'd.id') mathches 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();
...