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 选择所有 created_at
在一个查询中使用具有多个关联数组的 laravel eloquent 获取数据