【问题标题】:Laravel Eloquent select all rows with max created_atLaravel Eloquent 选择所有具有 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();

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

【问题讨论】:

    标签: php mysql laravel greatest-n-per-group


    【解决方案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();
    

    【讨论】:

      猜你喜欢
      • 2020-09-12
      • 2015-10-08
      • 2021-10-06
      • 1970-01-01
      • 2011-10-30
      • 1970-01-01
      • 2019-12-18
      • 2022-08-14
      • 2014-05-20
      相关资源
      最近更新 更多