Laravel Eloquent - 选择 MAX 与其他列

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/31501950/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-09-14 11:58:39  来源:igfitidea点击:

Laravel Eloquent - Select MAX with other columns

phpmysqllaraveleloquent

提问by Jean-Luc Tallis

I'm trying to select a number of columns along with MAX. The raw query would be something like: SELECT users.id, ..., MAX(ur.rank) AS rankbut I cannot figure out how to do it using the query builder supplied by Laravel in Eloquent.

我正在尝试与 MAX 一起选择一些列。原始查询类似于:SELECT users.id, ..., MAX(ur.rank) AS rank但我无法弄清楚如何使用 Laravel 在 Eloquent 中提供的查询构建器来完成它。

This is my attempt:

这是我的尝试:

$user = User::join('users_ranks AS ur', function($join) {
    $join ->on('ur.uid', '=', 'users.id');
})
->where('users.id', '=', 7)
->groupBy('users.id')
->first(['users.id', 'users.username', 'MAX(ur.rank) AS rank']);

I simply cannot figure it out. What I want to achieve is I'm selecting a user where users.id = 7, and I'm wanting to select the MAX rank that's in users_ranks where their users_ranks.uid = users.id.

我简直想不通。我想要实现的是我选择一个users.id = 7的用户,我想选择users_ranks中的最大排名,他们的users_ranks.uid = users.id。

I was told to avoid sub-queries as when working with large result sets, it can slow things down dramatically.

我被告知要避免子查询,因为在处理大型结果集时,它会显着减慢速度。

Can anyone point me in the right direction? Thanks.

任何人都可以指出我正确的方向吗?谢谢。

回答by M0rtiis

I think you should rewrite it like this:

我认为你应该像这样重写它:

DB::table('users')
    ->select(['users.id', 'users.username', DB::raw('MAX(ur.rank) AS rank')])
    ->leftJoin('users_ranks AS ur', 'ur.uid', '=', 'users.id')
    ->where('users.id', '=', 7)
    ->groupBy('users.id')
    ->first();

No sense to use User::if you use table names later and want to fetch not all of the fields ( 'users.id', 'users.username').

User::如果您稍后使用表名并且不想获取所有字段 ( 'users.id', 'users.username') ,则使用没有意义。