【问题标题】: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()之后使用;
  • 是的,编辑了,错误的副本。

标签: php sql laravel


【解决方案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,但我编辑了我的答案,希望不要搞砸
    • 那么你不应该回答这个问题,当你不完全知道如何使用查询构建器时(:
    猜你喜欢
    • 1970-01-01
    • 2018-08-30
    • 2016-09-26
    • 2021-08-20
    • 1970-01-01
    • 2014-10-05
    • 2017-09-25
    • 2010-11-03
    • 1970-01-01
    相关资源
    最近更新 更多