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