Как в phpstorm отключить службу ONLY_FULL_GROUP_BY?

73
06 февраля 2020, 17:30

Есть sql-запрос который в phpMyAdmin и консоли phpStorm работает правильно, но когда тот же самый запрос пытаюсь использовать в коде, ругается на то, что в groupBy() не перечислены поля указанные выше, когда их перечисляешь происходит дублирование записей. Попробовал инструментом Laravel - eloquent та же самая история. MySql - 5.6, php - 7.2, apache-php-7.2. В MySql - 5.7, 8.0 (возможно) sql-запрос не сработает, будет ругаться на синтаксис group by (или из-за др. причины). Подробнее см. код:

$clients = DB::connection("crm")->table('clients')
        ->selectRaw(
            " clients.id as ClientID,
            COALESCE(COALESCE(CONCAT(individuals.surname, ' ', individuals.name, ' ', individuals.patronymic), CONCAT(individuals.surname, ' ', individuals.name), individuals.name), entrepreneurs.name, legal_entities.name) as Fullname,
            client_types.name as Type,
            client_statuses.name as Status,
            resident_statuses.is_resident as IsResident,
            COALESCE(passports.date_of_birth, national_passports.date_of_birth, foreign_passports.date_of_birth) as DateOfBirth")
        ->leftJoin('individuals', 'clients.id', '=', 'individuals.client_id')
        ->leftJoin('entrepreneurs', 'clients.id', '=', 'entrepreneurs.client_id')
        ->leftJoin('legal_entities', 'clients.id', '=', 'legal_entities.client_id')
        ->join('client_types', 'client_types.id', '=', 'clients.client_type_id')
        ->join('client_statuses', 'client_statuses.id', '=', 'clients.client_status_id')
        ->leftJoin('resident_statuses', 'resident_statuses.client_id', '=', 'clients.id')
        ->leftJoin('documents', 'clients.id', '=', 'documents.client_id')
        ->leftJoin('passports', 'passports.document_id', '=', 'documents.id')
        ->leftJoin('national_passports', 'national_passports.document_id', '=', 'documents.id')
        ->leftJoin('foreign_passports', 'foreign_passports.document_id', '=', 'documents.id')
        ->leftJoin('international_passport_tjs', 'international_passport_tjs.document_id', '=', 'documents.id')
        ->groupBy('ClientID')
        ->limit(50)->get();
        return $clients;

При этом случае даёт след. ошибку:

Syntax error or access violation: 1055 'crm.individuals.surname' isn't in GROUP BY (SQL: select clients.id as ClientID и тд.

При ->groupBy('ClientID', 'Fullname', 'Type', 'Status', 'IsResident', 'DateOfBirth'), работает, но выдаёт дублирование записей (не всех), тобишь не исправно работает. Мне подсказали что only_full_group_by в настройках можно откл. Как это сделать в настройках phpMyAdmin нашёл, а повторить в настройках phpstorm не понял. Help me, как заставить группировать по ClientID?

P.S. Листинг работающего sql-запроса:

SELECT clients.id as ClientID,
       COALESCE(COALESCE(CONCAT(individuals.surname, ' ', individuals.name, ' ', individuals.patronymic), CONCAT(individuals.surname, ' ', individuals.name), individuals.name), entrepreneurs.name, legal_entities.name) as Fullname,
       client_types.name as Type,
       client_statuses.name as Status,
       resident_statuses.is_resident as IsResident,
       COALESCE(passports.date_of_birth, national_passports.date_of_birth, foreign_passports.date_of_birth, international_passport_tjs.date_of_birth) as DateOfBirth,
       COALESCE(passports.gender, national_passports.gender, foreign_passports.gender, international_passport_tjs.gender) as Gender,
       COALESCE(individuals.created_at, entrepreneurs.created_at, legal_entities.created_at) as created_at,
       COALESCE(individuals.updated_at, entrepreneurs.updated_at, legal_entities.updated_at) as updated_at,
       COALESCE(individuals.created_from_id, entrepreneurs.created_from_id, legal_entities.created_from_id) as created_from_id
FROM clients
       INNER JOIN client_types ON client_types.id = clients.client_type_id
       INNER JOIN client_statuses ON client_statuses.id = clients.client_status_id
       LEFT JOIN individuals ON clients.id = individuals.client_id
       LEFT JOIN entrepreneurs ON clients.id = entrepreneurs.client_id
       LEFT JOIN legal_entities ON clients.id = legal_entities.client_id
       LEFT JOIN documents ON clients.id = documents.client_id
       LEFT JOIN passports ON passports.document_id = documents.id
       LEFT JOIN national_passports ON national_passports.document_id = documents.id
       LEFT JOIN foreign_passports ON foreign_passports.document_id = documents.id
       LEFT JOIN international_passport_tjs ON international_passport_tjs.document_id = documents.id
       LEFT JOIN resident_statuses ON resident_statuses.client_id = clients.id
GROUP BY ClientID
LIMIT 20;

MySql - 5.6, php - 7.2, apache-php-7.2. В MySql - 5.7, 8.0 (возможно) sql-запрос не сработает, будет ругаться на синтаксис group by (или из-за др. причины).

Answer 1

Этот запрос работает правильно когда его используешь в phpMyAdmin или встроенной консоли БД phpStorm, но когда используешь такой запрос в коде (например рез-тат такого запрос присваиваешь какой-нибудь переменной) то не работает. Решение: в mysql 5.6 не работало, через openserver исправил на 8.0 и потом поверх coalesce использовал max(), впрочем как и говорилось в комментариях к вопросу. Сам я не считаю такой подход правильным (он должен без max адекватно работать), но в качестве временного решения подходит. Что странно ф-ия max() не сработало в mysql 5.6.