【发布时间】:2020-07-24 12:21:39
【问题描述】:
我要做的是从数据库中获取前 5 名球员的分数。我将玩家数据保存在 3 个表中,所以比较复杂。
现在我正在获得分数,但无法让每个用户都独一无二。
在前 5 名中,一名球员只能出现一次(即使他自己拥有前 5 名)
当前查询:
DB::table('gameplays', 'gameplay')
->join('users', 'gameplay.user_id', '=', 'users.id')
->join('playerdatas', 'gameplay.user_id', '=', 'playerdatas.user_id')
->select([ DB::raw('DISTINCT(gameplay.user_id)'), 'users.name', 'gameplay.score', 'gameplay.duration', 'gameplay.created_at', 'playerdatas.appearance'])
->where('gameplay.created_at', '>', Carbon::now()->subDays($type))
->where('gameplay.game_id', '=', $game_id)
->orderBy('gameplay.score', 'DESC')
->limit(5)
->get();
所以DISTINCT 不适合我,每个用户的所有分数都不是唯一的。
也尝试过:
->distinct('gameplay.user_id')
->groupBy('gameplay.user_id')
->unique('gameplay.user_id')
它在收集时与->unique('gameplay.user_id') 一起工作,但我想在查询中而不是在收集中使用它,因为我目前将结果限制为 5,所以我会错过一些记录。
Tables:
games
|id|name |
|1 |game1|
users
|id|name|
| 1|test|
| 2|elo |
| 3| me |
| 4| 3f2|
| 5| 123|
playerdatas
|id|user_id|game_id|appereance|
| 1| 1 | 1 | null |
| 1| 2 | 1 | null |
| 1| 3 | 1 | null |
| 1| 4 | 1 | null |
| 1| 5 | 1 | null |
gameplays
|id|game_id|score|created_at|user_id|
| 1| 1 | 100 |24.07.2020| 1 |
| 1| 1 | 700 |24.07.2020| 1 |
| 1| 1 | 400 |24.07.2020| 2 |
| 1| 1 | 300 |24.07.2020| 3 |
| 1| 1 | 200 |24.07.2020| 1 |
| 1| 1 | 400 |24.07.2020| 2 |
| 1| 1 | 500 |24.07.2020| 3 |
| 1| 1 | 100 |24.07.2020| 2 |
| 1| 1 | 200 |24.07.2020| 3 |
| 1| 1 | 100 |24.07.2020| 1 |
| 1| 1 | 900 |24.07.2020| 2 |
| 1| 1 | 870 |24.07.2020| 3 |
【问题讨论】:
-
如果能在帖子中添加各种表格就好了?
-
还有你的mysql版本。
-
@Aashishgaba 用表格更新了帖子
-
@P.Salmon mysql:5.7
-
如果是我,我会从原始 sql 开始。考虑到这一点,请参阅meta.stackoverflow.com/questions/333952/…
标签: php mysql database laravel eloquent