Проблема с SQL-запросом GROUP BY в Laravel Query Builder

Я написал следующий запрос MySQL, чтобы получать входящие сообщения пользователя с каждым пользователем, а также с последним сообщением ...

select *, `chat_channel` as `channel`, MAX(id) as max_id from `messages` 
where (`message_to` = 2 or `message_from` = 2) 
and (`delete_one` <> 2 and `delete_two` <> 2) 
group by `channel` 
order by `max_id` desc limit 40 offset 0

Метод Laravel, который я использую ...

public static function getInboxMessages($user_id, $limit = 40, $offset = 0, $search_key = null)
{
    return Message::hasSearch($search_key)->select("*", DB::raw("MAX(id) as max_id"))->where(function ($sql) use (
        $user_id
    ) {
        $sql->where('message_to', '=', $user_id);
        $sql->orWhere('message_from', '=', $user_id);
    })->where(function ($sql) use ($user_id) {
        $sql->where('delete_one', '<>', $user_id);
        $sql->where('delete_two', '<>', $user_id);
    })->with([
        'sender' => function ($q) {
            $q->select('id', 'uid', 'username', 'full_name', 'picture');
        }
    ])->with([
        'receiver' => function ($q) {
            $q->select('id', 'uid', 'username', 'full_name', 'picture');
        }
    ])->orderBy('max_id', 'DESC')->groupBy('chat_channel')->offset($offset)->limit($limit)->get();
}

Однако, когда я запускаю этот запрос в phpMyAdmin, я сталкиваюсь со следующей ошибкой ...

1055 - Expression #1 of SELECT list is not in GROUP BY clause and contains nonaggregated column 'db.messages.id' which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by

Когда я запускаю код Laravel напрямую, я не получаю никаких ошибок, но получаю записи, упорядоченные, как и ожидалось.

Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
В последние годы архитектура микросервисов приобрела популярность как способ построения масштабируемых и гибких приложений. Laravel , популярный PHP...
Как построить CRUD-приложение в Laravel
Как построить CRUD-приложение в Laravel
Laravel - это популярный PHP-фреймворк, который позволяет быстро и легко создавать веб-приложения. Одной из наиболее распространенных задач в...
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
В предыдущем посте мы создали функциональность вставки и чтения для нашей динамической СУБД. В этом посте мы собираемся реализовать функции обновления...
Документирование API с помощью Swagger на Springboot
Документирование API с помощью Swagger на Springboot
В предыдущей статье мы уже узнали, как создать Rest API с помощью Springboot и MySql .
Роли и разрешения пользователей без пакета Laravel 9
Роли и разрешения пользователей без пакета Laravel 9
Этот пост изначально был опубликован на techsolutionstuff.com .
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
В предыдущей статье мы завершили установку базы данных, для тех, кто не знает.
0
0
625
2

Ответы 2

Перейти к phpMyAdmin -> YourDB -> SQL Tab

Используйте следующую команду:

SET GLOBAL sql_mode = 'ONLY_FULL_GROUP_BY';

это включит только полную группу для вашего sql.

Чтобы отменить указанные выше изменения команды, используйте:

SET GLOBAL sql_mode=(SELECT REPLACE(@@sql_mode,'ONLY_FULL_GROUP_BY',''));

это STRICT MODE mysql для агрегирования. обратите внимание, что когда вы группируете по чему-то и выбираете другое неагрегированное поле, значение этого поля неверно на 100%. агрегированные поля - это такие поля, по которым вы группируете, count(field), sum(field) и т. д.

если вы готовы пойти на такой риск, перейдите к config\database.php и отредактируйте strict => true на false

'prefix' => '',
'strict' => false,
'engine' => null,

это не рекомендуется, и вам следует переработать свой запрос с join на group byselect

select x from table right join (select gb from table group by gb) as grouped on grouped.gb = table.gb

что-то вроде этого

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