按字段最大值过滤重复项
Filter duplicates by field max value
我在获取数据时遇到问题。我试图让所有用户都获得最大值(点数)。我的问题就像。
我的问题代码是:
$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]);
但问题是当我想删除重复项并为每个用户获得最高分时。
在不需要whereBetween的版本中我是这样处理的:
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();
谢谢
您为什么不直接 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 和用户名)的最大积分。
希望对您有所帮助。
我已经使用独特的方法形式 eloquent 解决了我的问题。
Game::with('user')
->whereBetween('created_at', [$start, $end])
->orderByDesc('points')
->orderBy('created_at')
->limit($limit)
->get()
->unique('user_id')
->values();
非常感谢 Lucas 的时间和帮助。
我在获取数据时遇到问题。我试图让所有用户都获得最大值(点数)。我的问题就像
我的问题代码是:
$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]);
但问题是当我想删除重复项并为每个用户获得最高分时。
在不需要whereBetween的版本中我是这样处理的:
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();
谢谢
您为什么不直接 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 和用户名)的最大积分。
希望对您有所帮助。
我已经使用独特的方法形式 eloquent 解决了我的问题。
Game::with('user')
->whereBetween('created_at', [$start, $end])
->orderByDesc('points')
->orderBy('created_at')
->limit($limit)
->get()
->unique('user_id')
->values();
非常感谢 Lucas 的时间和帮助。