将groupby()与orderby()和limit()一起使用

rwqw0loc  于 2021-06-20  发布在  Mysql
关注(0)|答案(1)|浏览(393)

我有一个db表,其中包含1000多个资产的记录,每个资产可以有1000个条目。
如:

ID         ASSET_ID  MANY_COLUMNS_OF_DATA  CREATED_AT
1          345       Stuff                 2018-04-01....
....
200        946       Stuff                 .....
...
3000       345       Stuff                 2018-05-01....
....
1000000    925       Stuff                 2018-05-01....

在一次通话中,我希望能够:
指定我需要的资产id。我相信。
按资产id对结果进行分组
只在特定日期或之前获取这些记录
把它们倒过来。我相信我可以使用orderby('id','desc)。
为每个资产标识获取特定数量的记录
我可能需要归还任何数量的资产,从1到n。
我玩过各种各样的方法,但有点不对劲,因为我只得到一张唱片返回。
例如:

USING THE DB FACADE
        $data = DB::table( 'table' )
            ->whereIn( 'asset_id', $assetIDs )
            ->groupBy( 'asset_id' )
            ->having( 'created_at', '<=', $this->dateINeed )
            ->limit( $numberOfRowsINeed )
            ->get();

        USING ELOQUENT
        $data = $modelToRead->whereIn( 'asset_id', $assetIDs )
            ->groupBy( 'asset_id' )
            ->where( 'created_at', '<=', $this->dateINeed )
            ->orderBy( 'id', 'desc' )
            ->take( $numberOfRowsINeed )
            ->get();

因此,我想返回的是一个数据数组,每个资产的记录单独列出,例如:

$data = [
   '345' => [
       .....
       .....
    ],
   '234' => [
       .....
       .....
    ],
   '123' => [
       .....
       .....
    ],
   'etc' => [
       .....
       .....
    ],
]

任何帮助都将不胜感激。
谢谢。

06odsfpq

06odsfpq1#

sql分组用于聚合数据,而不是组织输出。
删除查询生成器groupby方法调用(sql),获取所需的所有行,然后返回一个集合。

$collection = $model->...->get();

然后使用collection方法groupby按资产id组织所有集合。

$grouped = $collection->groupBy('asset_id');

相关问题