我在获取数据时遇到问题。我正在尝试让所有用户都拥有最大价值(积分)。我的问题就像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();
谢谢
答案 0 :(得分:0)
您为什么不简单地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
这样,您将获得每个用户的最大积分(id和用户名)。
希望这会有所帮助。
答案 1 :(得分:0)
我已经雄辩地使用了独特的方法形式解决了我的问题。
Game::with('user')
->whereBetween('created_at', [$start, $end])
->orderByDesc('points')
->orderBy('created_at')
->limit($limit)
->get()
->unique('user_id')
->values();
非常感谢卢卡斯的时间和帮助。