Laravel Eloquent 选择所有具有 max created_at 的行

Posted

技术标签:

【中文标题】Laravel Eloquent 选择所有具有 max created_at 的行【英文标题】:Laravel Eloquent select all rows with max created_at 【发布时间】:2018-06-06 03:30:28 【问题描述】:

我有一个表格,其中包含:

id  seller_id   amount   created_at
1   10          100      2017-06-01 00:00:00
2   15          250      2017-06-01 00:00:00
....
154 10          10000    2017-12-24 00:00:00
255 15          25000    2017-12-24 00:00:00

我想获取每个卖家 ID 的所有最新行。我可以像这样获得最新的一行:

$sales = Snapshot::where('seller_id', '=', 15)
    ->orderBy('created_at', 'DESC')
    ->first();

如何仅获取每个卖家的最新行?

【问题讨论】:

【参考方案1】:

要获取每个卖家 ID 的最新记录,您可以使用以下查询

select s.*
from snapshot s
left join snapshot s1 on s.seller_id = s1.seller_id
and s.created_at < s1.created_at
where s1.seller_id is null

使用查询生成器,您可以将其重写为

DB::table('snapshot as s')
  ->select('s.*')
  ->leftJoin('snapshot as s1', function ($join) 
        $join->on('s.seller_id', '=', 's1.seller_id')
             ->whereRaw(DB::raw('s.created_at < s1.created_at'));
   )
  ->whereNull('s1.seller_id')
  ->get();

【讨论】:

@u_mulder 首先感谢我认为它使用 alaises as u , u1 大家好,我正在使用 Laravel 5.2,我从加入中收到此错误:Call to undefined method Illuminate\Database\Query\JoinClause::whereRaw()。您认为这是版本问题吗? @TheRealPapa 你能试试where(),如果whereRaw() 我猜这个功能在5.2 中不可用 啊,答案是语法问题。节日快乐,感谢您的帮助!【参考方案2】:

这行得通:

DB::table('snapshot as s')
  ->select('s.*')
  ->leftJoin('snapshot as s1', function ($join) 
        $join->on('s.seller_id', '=', 's1.seller_id');
        $join->on('s.created_at', '<', 's1.created_at');
   )
  ->whereNull('s1.seller_id')
  ->get();

【讨论】:

以上是关于Laravel Eloquent 选择所有具有 max created_at 的行的主要内容,如果未能解决你的问题,请参考以下文章

从Laravel和Eloquent的桌子中选择所有

如何使用 Laravel eloquent 选择所有 created_at

Laravel Eloquent,仅选择存在关系的行

在一个查询中使用具有多个关联数组的 laravel eloquent 获取数据

Laravel Eloquent - 返回具有特定角色的用户(多对多关系)

Laravel Eloquent 关系方法语法