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-запрос.

Другие вопросы по тегам