按组排序(查询生成器)
Posted
技术标签:
【中文标题】按组排序(查询生成器)【英文标题】:Order by per group (Query Builder) 【发布时间】:2015-11-05 08:59:23 【问题描述】:我有一个用户和一个分数表。每个用户有多个分数,例如:
User1 有 3 个分数:45、66、98 User2 有 2 个分数:75、45 User3 有 3 个分数:94、66、12只有每个用户的最高分是相关的。我想要实现的是获得得分最高的 10 个用户。这适用于以下 laravel 查询:
$results = Score::orderBy('score', 'desc')
->groupBy('user_id')
->limit(10)
->get()
这个查询的问题是它返回的是排名靠前的用户,而不是他们的最高分。它返回组中的第一个分数。所以当我查询给定的例子时,这将返回:
1:用户 1,45 2:用户 3、94 3:用户 2,75如何确保它返回得分最高的***用户?我试图 ->distinct('score') 但这没有用。
【问题讨论】:
你尝试过“先分组再下单”? 是的,我做到了。没有什么不同。 这是错字吗?->limit(10);->get()
你在limit()
之后使用;
是的,编辑了,错误的副本。
【参考方案1】:
试试这个
$results = Score::select("*", DB::raw("MAX(score) as max")
->groupBy('user_id')
->orderBy('max', 'desc')
->limit(10)
->get();
【讨论】:
这将返回每个用户所有分数的总和,但只有每个用户的最高分数是相关的。【参考方案2】:试试这个:(查询生成器)
语法:
DB::table('name')->orderBy('column')->groupBy('column')->get();
修改您的查询:
$results = DB::table('score')
->orderBy('score', 'desc')
->groupBy('user_id')
->limit(10)
->get();
希望这有帮助。
【讨论】:
【参考方案3】:-- 我不太了解querybuilder,但是这个查询解决了问题
select top 10 *
from
(select userID, max(score) score from yourTable group by userID) K
order by score desc
【讨论】:
问题是关于如何使用查询构建器。 感谢 Rocky,我不知道 QueryBuilder,但我编辑了我的答案,希望不要搞砸 那么你不应该回答这个问题,当你不完全知道如何使用查询构建器时(:以上是关于按组排序(查询生成器)的主要内容,如果未能解决你的问题,请参考以下文章