按字段最大值过滤重复项

时间:2019-06-27 13:32:24

标签: mysql laravel eloquent laravel-query-builder

我在获取数据时遇到问题。我正在尝试让所有用户都拥有最大价值(积分)。我的问题就像OData filter by max value and field

我的问题的代码是:

 $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 :(得分:0)

您为什么不简单地GROUP BYusers.idusers.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

这样,您将获得每个用户的最大积分(id和用户名)。

希望这会有所帮助。

答案 1 :(得分:0)

我已经雄辩地使用了独特的方法形式解决了我的问题。

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

非常感谢卢卡斯的时间和帮助。