2015-11-05 48 views
2

我有一个用户和一个分数表。每个用户有多个分数,例如:按组排序(查询生成器)

  • 用户1具有分数:45,66,98
  • 用户2具有2分:75,45
  • 用户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

我怎样才能让肯定它会返回最高分的最高用户?我试图 - >明显('分数'),但没有奏效。

+0

你试图“组第一,当时的秩序”? – Paladin

+0

是的,我做到了。这没有什么区别。 –

+1

这是一个错误? '' - > limit(10); - > get()''你在''limit()后面使用'';''' – jmattheis

回答

2

试试这个

$results = Score::select("*", DB::raw("MAX(score) as max") 
    ->groupBy('user_id') 
    ->orderBy('max', 'desc') 
    ->limit(10) 
    ->get(); 
+0

这将返回每个用户的所有分数的总和,但只有每个用户的最高分数是相关的。 –

+1

我编辑了我的答案,检查了这一点@Slence – yudijohn

0

试试这个:(查询生成器)

语法:

DB::table('name')->orderBy('column')->groupBy('column')->get(); 

修改查询:

$results = DB::table('score') 
    ->orderBy('score', 'desc') 
    ->groupBy('user_id') 
    ->limit(10) 
    ->get(); 

希望这有帮助。

0

- 我不知道很好的QueryBuilder但此查询解决问题

select top 10 * 
from 
(select userID, max(score) score from yourTable group by userID) K 
order by score desc 
+1

问题是关于如何使用querybuilder来做到这一点。 – jmattheis

+0

感谢洛奇,我不知道QueryBuilder,但我编辑我的答案,我希望不要搞砸 –

+0

然后,你不应该回答这个问题,当你不完全知道如何使用querybuilder(: – jmattheis