MySQL ошибка выдается при использовании нумерации страниц
У меня создано представление базы данных, и когда я использую разбиение на страницы laravel против этого представления, оно выдает:
SQLSTATE[42000]: Syntax error or access violation: 1140 Mixing of GROUP columns (MIN(),MAX(),COUNT(),...) with no GROUP columns is illegal if there is no GROUP BY clause (SQL: select count(*) as aggregate from `parameter_log_site_detail` where `site_id` = EPE)
Но эта ошибка выскакивает только на живом сервере. Нумерация страниц хорошо работает на локальном сервере.
Просмотр БД: (parameter_log_site_detail)
select `t`.`site_id` AS `site_id`,cast(`t`.`logged_at` as date) AS `logged_on`,`t`.`daily_generation` AS `daily_generation`,`t`.`reading` AS `tot_reading` from `parameter_log_tab` `t` order by cast(`t`.`logged_at` as date) desc
Модель:
public function scopeSiteDailyReadings($query)
{
return $query->from('parameter_log_site_detail');
}
контроллер:
$generations = EnergyGeneration::siteDailyReadings()->where('site_id', $site_id)->orderBy('logged_on', 'desc')->paginate(15);
Информация о реальном сервере
MySQL Server version: 5.6.37 - MySQL Community Server (GPL)
PHP version: 5.6.30
Laravel version: 5.4
Информация о локальном сервере (где он работает нормально)
MySQL Server version: 5.7.19 - MySQL Community Server (GPL)
PHP version: 7.1.7
Laravel version: 5.4
Может ли кто-нибудь объяснить, что может быть причиной этого? Я прочитал о ONLY_FULL_GROUP_BY. Но не могу понять, является ли это причиной, поскольку версия сервера 5.6.*.
1 ответ
Можно установить режим SQL ONLY_FULL_GROUP_BY в MySQL 5.6, но он не установлен по умолчанию (см. https://dev.mysql.com/doc/refman/5.6/en/sql-mode.html).
Ага, я вижу, что ваш комментарий появился выше, вы подтвердили, что ONLY_FULL_GROUP_BY установлен на вашем локальном сервере (MySQL 5.7).
Я думаю, что вы ошиблись в описании вашей проблемы. Вы должны получить ошибку на своем локальном сервере, но не на действующем сервере, если локальный имеет ONLY_FULL_GROUP_BY, а живой нет.
Я предлагаю вам обязательно использовать ту же версию в разработке, что и версию, которую вы используете в рабочей среде, а также использовать тот же режим SQL. Это предотвратит путаницу во время разработки.
Я делаю то же самое предложение о версии PHP. Если вы используете в разработке несколько новых функций PHP 7, а затем внедрили их на работающий сервер PHP 5.6, они не будут работать.
SQL, который вы описываете, должен быть в порядке:
select count(*) as aggregate from `parameter_log_site_detail` where `site_id` = EPE
Это на самом деле хорошо, даже если у вас есть ONLY_FULL_GROUP_BY. Это, конечно, законно делать select count(*)
всех соответствующих строк в таблице. Вам не нужно предложение GROUP BY для этого запроса.
Но если вы смешаете агрегированные столбцы с неагрегированными столбцами, вы нарушите требования ONLY_FULL_GROUP_BY, потому что неагрегированные столбцы будут неоднозначными.
select id, count(*) as aggregate from ...
Интересно, вставляет ли Laravel дополнительные столбцы в ваш список выбора перед подготовкой запроса. Вы должны были бы включить журнал запросов MySQL, чтобы быть уверенным.
Я замечаю, что есть некоторые обсуждения этой ошибки по проблемам Laravel: https://github.com/laravel/framework/issues/15232
Решение, которое несколько пользователей в этой теме сказали, исправляет проблему, состоит в том, чтобы установить 'strict'=>false
в вашей конфигурации Laravel /database.php.
Но я бы поспорил, что основной причиной является то, что Laravel модифицирует ваш SQL-запрос.