не может сгруппироваться с красноречивым с PostreSQL - PullRequest
0 голосов
/ 05 июня 2018

Вот мой Eloquent запрос:

$visits = Visit::orderBy('date', 'desc')->groupBy('user_id')->get(['date', 'user_id']);

Но posgreSQL отклоняет запрос, сообщая мне:

SQLSTATE [42803]: ошибка группировки: 7 ОШИБКА: посещение столбца ".date "должен присутствовать в предложении GROUP BY или использоваться в статистической функции LINE 1: выберите" date "," user_id "из группы" посещения "с помощью ...

то же самое работаетна MySQL, когда я отключаю ONLY_FULLY_GROUP_BY

, что я могу сделать, чтобы это работало?Было бы здорово, если бы мне не пришлось редактировать конфиги, только код.

Ответы [ 2 ]

0 голосов
/ 06 июня 2018

Используя Postgre SQL вы можете использовать distinct on user_id и заказать столбец даты, чтобы выбрать самую последнюю дату для user_id. В laravel вы можете использовать необработанное выражение

$visits = Visit::select(DB::raw('distinct on (user_id)'), 'date')
          ->orderBy('date', 'desc')
          ->get();

Demo

0 голосов
/ 06 июня 2018

Выбирает самые последние date для каждого user_id:

$sub = Visit::select('user_id', DB::raw('max("date") "date"'))->groupBy('user_id');
$sql = '(' . $sub->toSql() . ') as "sub"';
$visits = Visit::join(DB::raw($sql), function($join) {
    $join->on('visits.user_id', 'sub.user_id')
        ->on('visits.date', 'sub.date');
})->orderBy('visits.date', 'desc')->get(['visits.date', 'visits.user_id']);

Если для комбинации user_id и date имеется несколько посещений, запрос возвращает их все.Удаление дубликатов возможно, но усложняет запрос.
После этого их легче удалить:

$visits = $visits->unique('user_id');
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...