Фильтровать дубликаты по максимальному значению поля - PullRequest
2 голосов
/ 27 июня 2019

У меня проблема с получением данных. Я пытаюсь получить всех пользователей с максимальным значением (баллов). Мой вопрос такой же, как Фильтр OData по максимальному значению и полю .

Код для моего вопроса:

 $query = User::select('users.id','users.username','games.points', 
 'games.created_at')
            ->join('games', 'users.id', '=', 'games.user_id')
            ->whereBetween('games.created_at', [$start, $end]);

Но проблема в том, когда я хочу удалить дубликаты и получить максимальное количество очков за каждого пользователя.

В версии, где мне не нужно, где я делаю таким образом:

 return User::select('users.id', 'users.username', 'games.points', 
                     'games.created_at')
            ->join('games', 'users.id', '=', 'games.user_id')
            ->whereRaw('(users.id, games.points) IN (SELECT user_id, MAX(points)                
                        FROM games GROUP BY user_id)')
            ->orderByDesc('points')
            ->get();

Спасибо

Ответы [ 2 ]

0 голосов
/ 28 июня 2019

Я решил свою проблему с помощью уникального метода eloquent.

Game::with('user')
            ->whereBetween('created_at', [$start, $end])
            ->orderByDesc('points')
            ->orderBy('created_at')
            ->limit($limit)
            ->get()
            ->unique('user_id')
            ->values();

Большое спасибо Лукасу за его время и помощь.

0 голосов
/ 27 июня 2019

Почему бы вам просто не GROUP BY запросить users.id и users.username?

-- I let you translate the query into your framework
SELECT users.id, users.username, max(games.points) as points
FROM users, games
WHERE users.id = games.user_id
AND games.created_at BETWEEN $start AND $end
GROUP BY users.id, users.username
ORDER BY max(games.points) DESC

Таким образом, вы получите максимум очков за пользователя (идентификатор и имя пользователя).

Надеюсь, это поможет.

...